Numeric error propagation: Difference between revisions

Content deleted Content added
Kotlin version
Kotlin: fields renamed, new constructor
Line 751: Line 751:
<lang scala>import java.lang.Math.*
<lang scala>import java.lang.Math.*


data class Approx(val value: Double = 0.0, val error: Double = 0.0) {
data class Approx(val ν: Double, val σ: Double = 0.0) {
constructor(a: Approx) : this(a.value, a.error)
constructor(a: Approx) : this(a.ν, a.σ)
constructor(n: Number) : this(n.toDouble(), 0.0)


override fun toString() = "$ν ±$σ"
operator infix fun plus(a: Approx) = Approx(value + a.value, sqrt(error * error + a.error * a.error))

operator infix fun plus(d: Double) = Approx(value + d, error)
operator infix fun minus(a: Approx) = Approx(value - a.value, sqrt(error * error + a.error * a.error))
operator infix fun plus(a: Approx) = Approx(ν + a.ν, sqrt(σ * σ + a.σ * a.σ))
operator infix fun minus(d: Double) = Approx(value - d, error)
operator infix fun plus(d: Double) = Approx(ν + d, σ)
operator infix fun minus(a: Approx) = Approx(ν - a.ν, sqrt(σ * σ + a.σ * a.σ))
operator infix fun minus(d: Double) = Approx(ν - d, σ)


operator infix fun times(a: Approx): Approx {
operator infix fun times(a: Approx): Approx {
val v = value * a.value
val v = ν * a.ν
return Approx(v, sqrt(v * v * (error * error) / (value * value) + a.error * a.error / (a.value * a.value)))
return Approx(v, sqrt(v * v * σ * σ / (ν * ν) + a.σ * a.σ / (a.ν * a.ν)))
}
}


operator infix fun times(d: Double) = Approx(value * d, abs(d * error))
operator infix fun times(d: Double) = Approx(ν * d, abs(d * σ))


operator infix fun div(a: Approx): Approx {
operator infix fun div(a: Approx): Approx {
val v = value / a.value
val v = ν / a.ν
return Approx(v, sqrt(v * v * (error * error) / (value * value) + a.error * a.error / (a.value * a.value)))
return Approx(v, sqrt(v * v * σ * σ / (ν * ν) + a.σ * a.σ / (a.ν * a.ν)))
}
}


operator infix fun div(d: Double) = Approx(value / d, abs(d * error))
operator infix fun div(d: Double) = Approx(ν / d, abs(d * σ))


fun pow(d: Double): Approx {
fun pow(d: Double): Approx {
val v = pow(value, d)
val v = pow(ν, d)
return Approx(v, abs(v * d * error / value))
return Approx(v, abs(v * d * σ / ν))
}
}

override fun toString() = "$value ±$error"
}
}