非常大数字的正弦的标准

Bru*_*och 7 floating-point decimal ieee-754

我正在TeX中编写一个(几乎)IEEE 854兼容的浮点实现(它只支持32位整数).该标准仅规定的结果+,-,*,/,比较,余数,并且sqrt:对于这些操作,结果应(根据舍入模式)是相同的舍入准确结果的表示的数.

我似乎记得IEEE指定超越函数(sin,exp...)应该产生忠实的结果(在默认的舍入到最近的模式中,它们应该输出围绕确切结果的两个可表示数字之一).计算小数的正弦是相当简单的:移动2*pi的倍数以获得[0,2*pi]范围内的数字,然后再做一些工作以将范围缩小到[0,pi/4] ,并使用泰勒系列.

现在假设我想计算sin(1e300).为此,我需要找到1e300 modulo 2*pi.这需要知道pi的300(316?)个小数,因为只有16个小数,结果没有任何意义(特别是,它不是忠实的).

关于结果sin(1e300)和类似的非常大的数字应该有标准吗?

其他浮点实现有什么作用?

Ste*_*non 9

没有标准要求忠实地舍入超越功能.IEEE-754(2008)建议但不要求正确舍入这些功能.

大多数优秀的数学图书馆都致力于在整个范围内提供忠实圆润的结果(是的,即使对于大量输入sin( )和类似的困难情况)也是如此.正如您所注意到的,这要求库知道更多的π数字,然后在最大可表示数字中有数字.这被称为"无限pi"参数减少.

为了@spraff提升,优秀的数学库采用输入无限精确的观点(即,函数应该表现得好像输入总是准确地表示).人们可以辩论这是否是一个合理的位置,但这是基本上所有优秀数学库的工作假设.

总而言之,有很多库采用简单的路径并使用"有限pi"减少,这基本上将函数sin( )视为π是可表示的有限数.事实证明,这对大多数用途并没有造成任何麻烦,而且肯定更容易实现.

  • @BrunoLeFloch .NET库很难"好".我刚刚意识到,当参数超过`Pow(2,63)`时,[`Sin`](http://msdn.microsoft.com/en-us/library/system.math.sin.aspx)方法返回它的论点不变!因此,虽然`Sin(9.223372036854775E + 18)== 0.98734189131435146`可能不准确,但是Sin(9.223372036854776E + 18)`大约是`9.22E + 18` ... (5认同)
  • 当你有很大的参数时,“无限 pi 参数减少”会有所帮助,但当你有*非常*大的参数时,则没有帮助。对于一个库来说,假设它的输入是准确的很好,但是当 input+epsilon==input 时,它就不再重要了。 (2认同)
  • @spraff:*出于向后错误分析的目的*并不重要。当使用其他形式的错误分析时,这确实很重要,这就是最好的数学库所遵循的标准。例如,参见 KC Ng 的“Good to the Last Bit”进行讨论。 (2认同)