Numeric error propagation: Difference between revisions
Content added Content deleted
m (Add output.) |
(+Java) |
||
Line 627: | Line 627: | ||
<lang j> exp&0.5 (x1 sub x2) add&(exp&2) y1 sub y2 |
<lang j> exp&0.5 (x1 sub x2) add&(exp&2) y1 sub y2 |
||
111.803 2.48717</lang> |
111.803 2.48717</lang> |
||
=={{header|Java}}== |
|||
<lang java>public class Approx { |
|||
private double value; |
|||
private double error; |
|||
public Approx(){this.value = this.error = 0;} |
|||
public Approx(Approx b){ |
|||
this.value = b.value; |
|||
this.error = b.error; |
|||
} |
|||
public Approx(double value, double error){ |
|||
this.value = value; |
|||
this.error = error; |
|||
} |
|||
public Approx add(Approx b){ |
|||
value+= b.value; |
|||
error = Math.sqrt(error * error + b.error * b.error); |
|||
return this; |
|||
} |
|||
public Approx add(double b){ |
|||
value+= b; |
|||
return this; |
|||
} |
|||
public Approx sub(Approx b){ |
|||
value-= b.value; |
|||
error = Math.sqrt(error * error + b.error * b.error); |
|||
return this; |
|||
} |
|||
public Approx sub(double b){ |
|||
value-= b; |
|||
return this; |
|||
} |
|||
public Approx mult(Approx b){ |
|||
double oldVal = value; |
|||
value*= b.value; |
|||
error = Math.sqrt(value * value * (error*error) / (oldVal*oldVal) + |
|||
(b.error*b.error) / (b.value*b.value)); |
|||
return this; |
|||
} |
|||
public Approx mult(double b){ |
|||
value*= b; |
|||
error = Math.abs(b * error); |
|||
return this; |
|||
} |
|||
public Approx div(Approx b){ |
|||
double oldVal = value; |
|||
value/= b.value; |
|||
error = Math.sqrt(value * value * (error*error) / (oldVal*oldVal) + |
|||
(b.error*b.error) / (b.value*b.value)); |
|||
return this; |
|||
} |
|||
public Approx div(double b){ |
|||
value/= b; |
|||
error = Math.abs(b * error); |
|||
return this; |
|||
} |
|||
public Approx pow(double b){ |
|||
double oldVal = value; |
|||
value = Math.pow(value, b); |
|||
error = Math.abs(value * b * (error / oldVal)); |
|||
return this; |
|||
} |
|||
@Override |
|||
public String toString(){return value+"±"+error;} |
|||
public static void main(String[] args){ |
|||
Approx x1 = new Approx(100, 1.1); |
|||
Approx x2 = new Approx(50, 1.2); |
|||
Approx y1 = new Approx(200, 2.2); |
|||
Approx y2 = new Approx(100, 2.3); |
|||
x1.sub(x2).pow(2).add(y1.sub(y2).pow(2)).pow(0.5); |
|||
System.out.println(x1); |
|||
} |
|||
}</lang> |
|||
Output: |
|||
<pre>111.80339887498948±2.938366893361004</pre> |
|||
=={{header|Mathematica}}== |
=={{header|Mathematica}}== |
||
<lang mathematica>PlusMinus /: a_ ± σa_ + c_?NumericQ := N[(a + c) ± σa]; |
<lang mathematica>PlusMinus /: a_ ± σa_ + c_?NumericQ := N[(a + c) ± σa]; |