-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathErrorProp.py
More file actions
75 lines (55 loc) · 2.56 KB
/
Copy pathErrorProp.py
File metadata and controls
75 lines (55 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import math
from mpmath import mp, mpf
mp.dps = 6
class ErroredValue(object):
def __init__(self, value, delta=0, percent_err=None):
self.value = mpf(value)
if type(percent_err) is float or type(percent_err) is int:
self.delta = mpf(value * percent_err * 0.01)
else:
self.delta = mpf(delta)
def __add__(self, o):
if type(o) != ErroredValue:
o = ErroredValue(o)
return ErroredValue((self.value+o.value), (((self.delta**2) + (o.delta**2))**0.5))
def __radd__(self, o):
return ErroredValue((o+self.value), (((self.delta**2) + 0)**0.5))
def __radd__(self, o):
return ErroredValue((o+self.value), (((self.delta**2) + 0)**0.5))
def __sub__(self, o):
if o is self: return ErroredValue(0)
if type(o) != ErroredValue:
o = ErroredValue(o)
return ErroredValue((self.value-o.value), (((self.delta**2) + (o.delta**2))**0.5))
def __rsub__(self, o):
return ErroredValue((o-self.value), (((self.delta**2) + 0)**0.5))
def __rsub__(self, o):
return ErroredValue((o-self.value), (((self.delta**2) + 0)**0.5))
def __mul__(self, o):
if type(o) != ErroredValue:
o = ErroredValue(o)
return ErroredValue((self.value*o.value), (self.value*o.value)*(((self.delta/self.value)**2 + (o.delta/o.value)**2)**0.5))
def __rmul__(self, o):
return ErroredValue((o*self.value), (o*self.value)*(((self.delta/self.value)**2 + 0)**0.5))
def __truediv__(self, o):
if self is o: return ErroredValue(1)
if type(o) != ErroredValue:
o = ErroredValue(o)
return ErroredValue((self.value/o.value), (self.value/o.value)*(((self.delta/self.value)**2 + (o.delta/o.value)**2)**0.5))
def __rtruediv__(self,o):
return ErroredValue(o) / self
# https://physics.stackexchange.com/questions/411879/how-to-calculate-the-percentage-error-of-ex-if-percentage-error-in-measuring
def __rpow__(self, a):
return ErroredValue(a**(self.value), (0.5**self.value)*math.log(a, math.e)*self.delta)
def __pow__(self, p):
return ErroredValue(self.value**p, abs(self.value**p) * (self.delta / abs(self.value)))
def __str__(self):
return f'{self.value}±{self.delta}'
def __repr__(self):
return f'<ErroredValue {self.value}±{self.delta} at {hex(id(self))}>'
@property
def percentDelta(self):
return self.delta/self.value
@staticmethod
def ln(a):
return ErroredValue(math.log(a.value, math.e), ((a.delta)/a.value))