Floating point 比较精度降低的浮动列表
我正在为一个函数编写测试,该函数进行大量浮点数计算。当然,在计算浮动时,您不希望得到完全准确的结果。但是,这对于我的测试来说是个问题,因为我需要将预期结果与函数生成的实际结果进行比较 我的函数的结果是一个浮点列表。例如:Floating point 比较精度降低的浮动列表,floating-point,common-lisp,precision,floating-accuracy,Floating Point,Common Lisp,Precision,Floating Accuracy,我正在为一个函数编写测试,该函数进行大量浮点数计算。当然,在计算浮动时,您不希望得到完全准确的结果。但是,这对于我的测试来说是个问题,因为我需要将预期结果与函数生成的实际结果进行比较 我的函数的结果是一个浮点列表。例如: (is (my-function "arg1" "arg2") '((0 1.0) (1 2.0))) 将产生: ((0 1.00000014) (1 2.1)) is expected to be ((0 1) (1 2.1)) 我的问题是:如何遍历
(is (my-function "arg1" "arg2")
'((0 1.0)
(1 2.0)))
将产生:
((0 1.00000014) (1 2.1)) is expected to be ((0 1) (1 2.1))
我的问题是:如何遍历列表并比较精度降低的每个数字?
允许我在比较预期结果和实际结果时指定测试函数。以下是我目前的代码:
(defun compare-floats (f1 f2)
(= (round-to f1 6)
(round-to f2 6)))
(defun round-to (number &optional (precision 6))
(let ((div (expt 10 precision)))
(/ (round (* number div)) div)))
(is (my-function "arg1" "arg2")
'((0 1.0)
(1 2.0))
:test #'(lambda (expected actual)
(every #'identity
(mapcar #'(lambda (list1 list2)
(compare-floats (second list1)
(second list2)))
expected
actual))))
这很管用,但不是很优雅。在我看来:
(every #'identity
(mapcar #'(lambda (list1 list2)
(compare-floats (second list1)
(second list2)))
expected
actual))
。。。可以这样写:
(every (lambda (list1 list2)
(compare-floats (second list1) (second list2)))
actual
expected)
请注意,每一个
都会在一个测试返回NIL时停止比较数字,而在原始函数中不是这样。如果你做了重要的副作用,这将是不同的
至于测试浮动,我会使用类似这样的方法:
(defun floats-rougly-equal-p (f1 f2 &optional (precision 1e-6))
(< (abs (- f1 f2)) precision))
(除浮点数-rougly-equal-p(f1-f2和可选(精度1e-6))
(<(abs(-f1 f2))精度)
但是,如果你的代码可以工作,不要试图花太多时间寻找最优雅的方法 在我看来:
(every #'identity
(mapcar #'(lambda (list1 list2)
(compare-floats (second list1)
(second list2)))
expected
actual))
。。。可以这样写:
(every (lambda (list1 list2)
(compare-floats (second list1) (second list2)))
actual
expected)
请注意,每一个
都会在一个测试返回NIL时停止比较数字,而在原始函数中不是这样。如果你做了重要的副作用,这将是不同的
至于测试浮动,我会使用类似这样的方法:
(defun floats-rougly-equal-p (f1 f2 &optional (precision 1e-6))
(< (abs (- f1 f2)) precision))
(除浮点数-rougly-equal-p(f1-f2和可选(精度1e-6))
(<(abs(-f1 f2))精度)
但是,如果你的代码可以工作,不要试图花太多时间寻找最优雅的方法 循环:
(loop for (nil a) in actual
and (nil b) in expected
always (compare-floats a b))
顺便说一句,Common Lisp还提供双浮点…循环:
(loop for (nil a) in actual
and (nil b) in expected
always (compare-floats a b))
顺便说一句,Common Lisp还提供了双浮点…谢谢!确实好多了。:)我之所以“花时间”,是因为我试图在编程方面变得更好:)当然,可以说一个好的开发人员知道什么时候该继续前进…@tsikov,我明白。这只是一个警告:
(声明(优化(优雅3))
未标准化。谢谢!确实好多了。:)我之所以“花时间”,是因为我试图在编程方面变得更好:)当然,可以说一个好的开发人员知道什么时候该继续前进…@tsikov,我明白。这只是一个警告:(declare(optimize(优雅3))
没有标准化。