Math std::erf的精度是多少?

Math std::erf的精度是多少?,math,c++11,precision,double-precision,Math,C++11,Precision,Double Precision,C++11在标准中引入了非常有用的数学函数,如和。对于大于或小于特定值的输入,有人提到“保证下溢”,但我对浮点表示了解不够,无法清楚地理解这在精度方面意味着什么 如果这个问题有意义;我可以从标准库实现的近似值(如果指定)中获得什么样的精度(至少数量级) 这取决于实现的质量,这取决于编译器的供应商(或运行库,如果单独获得)。在最佳情况下,精度将与您使用的特定类型(双精度、长双精度等)的精度相匹配 请注意,返回值的精度与保证的下溢无关。这只是一个强制的后置条件,如果输入超出预期的域,则确保返回值是正

C++11在标准中引入了非常有用的数学函数,如和。对于大于或小于特定值的输入,有人提到“保证下溢”,但我对浮点表示了解不够,无法清楚地理解这在精度方面意味着什么


如果这个问题有意义;我可以从标准库实现的近似值(如果指定)中获得什么样的精度(至少数量级)

这取决于实现的质量,这取决于编译器的供应商(或运行库,如果单独获得)。在最佳情况下,精度将与您使用的特定类型(双精度、长双精度等)的精度相匹配


请注意,返回值的精度与保证的下溢无关。这只是一个强制的后置条件,如果输入超出预期的域,则确保返回值是正确的。

我发现,从标准来看,不保证最低精度不是很好;这使得依靠这些函数进行数值处理变得困难。但谢谢你,这回答了我的问题:)是的,那会让生活更轻松。问题是,对于依赖于三角运算的函数,由于精度越高,计算时间越长,因此很难实现。如果您有一个执行这些操作的协处理器,那么您的精度也会受到其精度的影响,依此类推。因此,在这里很难达到标准,特别是对于一个大型委员会,更难遵守标准。@Sh3ljohn:虽然语言标准对特定的数学函数不要求任何特定的精度,但库的供应商可能会提供关于实现的最大误差的信息,或者称为绝对误差,相对错误,或者,请检查文档。健壮的数学库通常为
erf()
erfc()
提供带有少量(单个数字)ULP错误的结果。在良好的实现中,没有“特殊的下溢FP值”,如果
erf
erfc
计算的值比最小的低于正常值的浮点数更接近零,则将得到0和下溢标志。未指定该值。我相信当一个弧度的正弦要求时,允许一个符合C++的实现,说“<代码> 42”/代码>。然而,在实践中,您可以假设双精度
erf
是精确四舍五入的——您将得到与您输入的数字的erf最接近的两个浮点数中的一个。@tmyklebu我相信您,但假设我得到这个数字,这意味着标准实现至少有17位小数精度。我确实崇拜并信任我使用的C++编译器的销售商(GCC和CLAN),但这对我来说似乎是一个不合理的假设,考虑到我发现的大多数近似值都不超过7位十进制数字的精度。不是我在抱怨;我确实希望这是一个相当粗糙的近似值,我只是希望我能知道它有多粗糙。你不能用“数字”来衡量这样一个函数的精度,除非它是一个非常糟糕的近似值。即使对于功能
x/3
,也无法实现17位正确,但返回一个
double
;考虑输入<代码> 29 <代码>。在“标准C++”的意义上没有“标准实现”,但在GLIMC中的一个是忠实的四舍五入,我希望苹果也能做到。我没有检查过fdlibm的
erf
/
erfc
,如果它有它们的话。glibc的
erf
erfc
实际上来自fdlibm,所以fdlibm的
erf
erfc
也被忠实地四舍五入。仅供参考:我在(-5,5)中测试了标准实现的统一值针对python多精度库mpmath,实际上它似乎既快速又非常准确!我惊喜地说:)