Numeric error propagation: Difference between revisions

Content added Content deleted
(Add Common Lisp implementation.)
m (Use symbols to make the code more readable.)
Line 477: Line 477:
(format stream "~,2F ± ~,2F" (uncertain-number-value n) (uncertain-number-uncertainty n)))
(format stream "~,2F ± ~,2F" (uncertain-number-value n) (uncertain-number-uncertainty n)))


(defun add (n1 n2)
(defun ~+ (n1 n2)
(let* ((value1 (uncertain-number-value n1))
(let* ((value1 (uncertain-number-value n1))
(value2 (uncertain-number-value n2))
(value2 (uncertain-number-value n2))
Line 491: Line 491:
:uncertainty (uncertain-number-uncertainty n)))
:uncertainty (uncertain-number-uncertainty n)))


(defun subtract (n1 n2)
(defun ~- (n1 n2)
(add n1 (negate n2)))
(~+ n1 (negate n2)))


(defun multiply (n1 n2)
(defun ~* (n1 n2)
(let* ((value1 (uncertain-number-value n1))
(let* ((value1 (uncertain-number-value n1))
(value2 (uncertain-number-value n2))
(value2 (uncertain-number-value n2))
Line 510: Line 510:
:uncertainty (uncertain-number-uncertainty n)))
:uncertainty (uncertain-number-uncertainty n)))


(defun divide (n1 n2)
(defun ~/ (n1 n2)
(multiply n1 (inverse n2)))
(~* n1 (inverse n2)))


(defun exponentiate (base exp)
(defun ~expt (base exp)
(let* ((base-value (uncertain-number-value base))
(let* ((base-value (uncertain-number-value base))
(uncertainty-ratio (/ (uncertain-number-uncertainty base) base-value))
(uncertainty-ratio (/ (uncertain-number-uncertainty base) base-value))
Line 525: Line 525:
(x2 (make-uncertain-number :value 200 :uncertainty 2.2))
(x2 (make-uncertain-number :value 200 :uncertainty 2.2))
(y2 (make-uncertain-number :value 100 :uncertainty 2.3))
(y2 (make-uncertain-number :value 100 :uncertainty 2.3))
(d (exponentiate (add (exponentiate (subtract x1 x2) 2)
(d (~expt (~+ (~expt (~- x1 x2) 2) (~expt (~- y1 y2) 2))
(exponentiate (subtract y1 y2) 2))
1/2)))
1/2)))
(format t "d = ~A~%" d)))</lang>
(format t "d = ~A~%" d)))</lang>
{{out}}
{{out}}