(宽)Maxima:在浮点数中使用“equal”的最佳实践是什么?

(wx)Maxima: what are the best practices for using `equal` with floats?

提问人:Rax Adaam 提问时间:10/18/2021 更新时间:10/18/2021 访问量:112

问:

我正在处理具有以下形式的数据:

/* initial value */
  xi:-8$ 

/* intermediate value */
  a:-0.2$ 

/* final value */
  xf:8$

/* step size */
  dx:0.1$ 

/* first list of values */
  x1:makelist(i,i, xi, a, dx)$

/* second list of values */
  x2:makelist(i, i, a, xf, dx)$

然后

is(equal(last(x1), first(x2)));

返回。false

我想避免这个问题的最简单方法是在给定的示例中定义 ;但是,我想知道如果一个人无法控制数据,可以使用哪些策略?dx = 1/10

我考虑过类似的东西;然而,这种方法似乎并不能很好地推广到人们先验地不知道数量数量级的情况。is(equal( floor(last(x1)*10)/10, floor(first(x1)*10)/10 ))

是否有某个版本的for浮点数仅检查特定的十进制精度?我检查了“数字函数”和“相等”的文档,但没有看到任何适用的内容 (AFAICT)。equal

浮点 相等 最大值 wxmaxima

评论

0赞 Eric Postpischil 10/18/2021
对于比较包含先前操作错误的浮点数,没有通用解决方案。当操作对结果进行四舍五入时,信息会丢失。它消失了,无法通过巧妙的比较来恢复。如何避免或处理这种情况是特定于应用程序的;没有最佳实践。
0赞 Rax Adaam 10/18/2021
谢谢。我确实明白这个问题是普遍的;我想我假设,鉴于它必须有多普遍,会有标准策略,因此,也许有内置函数(例如;或;,或者也许是一些将值转换为附近有理值的函数,直到一些容错;甚至只是一些相关的设置: 我本来以为设置会影响这里的结果, 但事实并非如此);无论如何,我从你的回复中了解到情况并非如此。感谢您抽出宝贵时间接受采访。float_equal(val1, val2, precisicion)equal_up_to_error(val1, val2, error)fpprecfpprec

答: 暂无答案