浮点函数的隐含精度


9

在回顾另一位程序员对某个函数实现以计算正态分布CDF的实现时,我建议用Python的内置函数替换整个实现,或者使用通用的科学库SciPy。

另一位程序员指出,他们的文档中也math.erfc()没有scipy.stats.norm.cdf()提供任何精度保证。因此,在替换近似算法(该算法取自颇受好评的源,并记录了错误范围)时,我应该格外谨慎。

老实说,怀疑内置或库函数的准确性和精确度的想法从来没有想到。毕竟,多年来我一直在不停地调用诸如sin()和之类的函数,sqrt()为什么math.erf()还是scipy.stats.norm.cdf()应该有所不同呢?

但是现在,我很担心。我的问题是:

  1. 通常,如果文档中没有特别提及,是否暗示这些功能在IEEE双精度浮点提供的精度范围内完全精确到最后一位小数?
  2. 尤其是对于Python math.erf()或SciPy而言,这是真的scipy.stats.norm.cdf()吗?你怎么知道?
  3. 手册页sin()说……

    当它们的参数接近pi的倍数或远离0.0时,这些函数可能会失去准确性。

    当正弦函数是周期性且对称的时,为什么要存在这样的警告?似乎给调用者增加了规范输入以获取最佳准确性的负担。

    另一方面,Mozilla的文档中Math.sin()没有提及准确性或精度。这是否意味着它是完全准确的,还是Math.sin()仅在某些情况下才像其他地方一样在JavaScript中才是准确的“常识” ?


1
仅供参考,关于问题1:通常,精度保证是根据ULP(最后一个单位)给出的,ULP是指浮点数的二进制数字。

Answers:


10

如果文档中没有特别提及,是否意味着这些功能在IEEE双精度浮点提供的精度范围内完全精确到最后一位小数?

我不会做那个假设。

在我工作的地方,我们处理遥测数据,并且众所周知,两个不同的数学库都可以产生两个不同的结果,即使它们都符合IEEE浮点标准。 当您尝试重复计算并比较两个结果是否相等时,这会产生影响。

似乎给调用者增加了规范输入以获取最佳准确性的负担。

这是一个公平的评估。可以接受的是,文档说明了这一点,因此没有任何意外。

另一方面,Mozilla的文档...

我建议您尝试使用每种库或编程语言进行一些计算(尤其是在边界区域附近,如sin()的倍数附近pi),并进行比较。这应该使您对每种行为可以期望的行为有一个清晰的认识。


2
测试是一个好主意。文档无数次说明一件事,而功能却以另一种方式出现。OP希望依靠甚至没有记载的隐式假设。
任思远2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.