什么"错误中的不连续性"这个三角参数减少是否存在?

时间:2017-03-16 20:20:45

标签: c c99

我一直在阅读C99 Rationale,在那里我发现了这个神秘的摘录(重点是我的):

  

7.12.4三角函数

     

实施说明:应该减少三角形参数   通过一种不会导致灾难性不连续的方法进行   计算结果的错误。特别是,仅基于方法   天真地应用像

这样的计算      

x - (2*pi) * (int)(x/(2*pi))

     

是不明智的。

这种减少公式究竟出了什么问题?看来,根据周期性的特征,它看起来很好,间隔为2*pi

1 个答案:

答案 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 。最好使用remquosind() example