我一直在阅读C99 Rationale,在那里我发现了这个神秘的摘录(重点是我的):
7.12.4三角函数
实施说明:应该减少三角形参数 通过一种不会导致灾难性不连续的方法进行 计算结果的错误。特别是,仅基于方法 天真地应用像
这样的计算
x - (2*pi) * (int)(x/(2*pi))
是不明智的。
这种减少公式究竟出了什么问题?看来,根据周期性的特征,它看起来很好,间隔为2*pi
。
答案 0 :(得分:2)
π是无法用有限浮点值精确表示的无理数 - 这些都是合理的。
各种实现支持类似M_PI
的常量,它几乎是,但不完全是π。所以下面介绍错误。当然,如果(x/(2*pi)
超过int
范围,则会出现问题。
double pi = M_PI;
double x; // radians
double y; // reduced radians.
y = x - (2*pi) * (int)(x/(2*pi))
如果此错误对代码非常重要,则特定于应用程序。典型问题是tan(x)
x
接近π*(n +1/2),x
稍微变化会产生+或 - 无穷大/ DBL_MAX
。
某些平台提供π减少功能。
这个问题的一个很好的参考是ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit K. C. Ng和SunPro的FP组成员
以度数减少:
度数的范围缩减为fmod(x,360.0)
,可以将x
缩小到范围-360.0 < x < +360.0
。最好使用remquo
:sind()
example