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))
没有标准化。