c++ Visual Studio MSVC中的erf的准确性是多少?

cotxawn7  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(144)

我需要在我的代码中使用erf函数,<cmath>中包含了一个标准实现。对我来说,知道结果的准确性很重要。有人知道它是如何实现的吗(什么算法或近似)?
我正在使用Visual Studio,如果这有区别的话。
编辑:这不是this question的重复,因为我想知道我使用的实现(MS Visual Studio)的精度,相关的问题只说答案是特定于实现的。

okxuctiv

okxuctiv1#

由于您正在专门寻找MSVC实现定义的行为,因此可以使用MSVC documentation
这些函数的实现是为了平衡性能和正确性。由于生成正确舍入的结果可能代价高昂,因此这些函数旨在有效地生成与正确舍入的结果接近的近似值。在大多数情况下,生成的结果与正确舍入的结果在+/-1 ulp范围内,尽管可能存在更大的不准确性。

klr1opcd

klr1opcd2#

解决方案可能是不使用cmath版本(Visual Studio可能不会公开内部实现),而是依赖于提供所需信息的实现:
例如Boost Error Functions,可能还有其他开源实现。
boost实现附带了一个Accuracy表,其中列出了一些实现的精度,如果提供的信息不够,您实际上可以查看源代码。

f8rj6qna

f8rj6qna3#

使用任意精度库作为黄金参考,可以轻松地在几分钟内以 * 单精度 * 生成单参数数学函数的最大误差的准确表征。我使用了过去三十年来一直使用的库:布伦特1978年的MP。我不建议在新开发中使用此库。
我在MSVC 2019中发现的最大错误(Microsoft(R)C/C++ Optimizing Quancher Version 19.27.29112)在1.44902849f (0x1.72f388p+0)处的输出为3.98346 ulps。对于 * 双精度 ,详尽的测试还不可行。但人们肯定可以得到一个快速的印象简单地通过调用带有许多随机参数的测试函数。以这种方式,我发现在MSVC 2019的erf()实现中,对于1.4761501386374922 (0x1.79e4f9b96f13cp+0)的参数,最大错误为3.98213 ulps。
Brian Gladman,Crienzo Innocente和Paul Zimmermann,
单精度,双精度,双扩展和四倍精度 * 的数学函数的准确性,hal-03141101v5,2023年9月21日
正在进行中,目前为所有主要数学库提供准确性跟踪,包括MSVC 2022使用的数学库。作者报告了基于穷举测试的单精度erff()的最大误差<= 3.99 ulps,这与我对MSVC 2019的发现一致。为了找到双精度函数的最大误差,他们使用了一个相当复杂的搜索启发式算法,比简单的随机搜索优越上级。通过这个算法,他们在0x1.755dca4d8b458p+0处确定了erf()的最大误差<= 4.62 ulps。使用MSVC 2019的1.4584623755756834 (0x1.755dca4d8b458p+0)的特定输入,我确定误差为4.61892 ulps。

相关问题