【问题标题】:Why does math.h define pi, pi/2, 2/pi but not 2*pi? [closed]为什么 math.h 定义 pi、pi/2、2/pi 而不是 2*pi? [关闭]
【发布时间】:2012-11-05 18:24:34
【问题描述】:

这是一个非常简单的问题:为什么 pi、pi/2、pi/4、1/pi 和 2/pi 有 predefined constants 而 2*pi 没有?是不是有更深层次的原因?

这个问题不是关于整个pi vs tau debate。我想知道是否有实现某些常量而不是其他常量的技术原因。我能想到两种可能:

  1. 避免舍入错误。
  2. 避免可能更昂贵的运行时划分。

【问题讨论】:

  • 你想用2*pi做什么?大多数三角函数,例如,在2*pi 之后“重复”(具有2*pi 的平移对称性)。 (更正式地,例如,sin(a) = sin(b) if a = b (mod 2*pi)。)这使得在用作这些函数的参数的数字中添加或减去 2*pi 毫无用处。
  • @MvanGeest 有很多用例。从正态分布、快速傅里叶变换、柯西积分开始怎么样?
  • 他们为什么不同时定义3*pi12*pi-4*pi?这个问题要求进行没有明确答案的讨论,除非math.h 的原作者之一碰巧停下来回答它。抱歉,但投票结束是不具建设性的; FAQ 特别提到讨论和推测类型的问题不适合这里的设计。
  • @Ken:或者其中一位作者在其他地方回答过,有人可以找到该答案并参考它。我真的不明白为什么人们认为标准的基本原理问题是无法回答的——会议(有点)被记录了。
  • 我很在意,因为我每天输入这个常数大约 100 次。

标签: c math.h


【解决方案1】:

2*M_PI这么难写吗?

说真的,曾几何时,当人们担心可能不会进行常量折叠和除法的简单编译器过于昂贵时,拥有一个常量 PI/2 而不是冒运行时除法的风险实际上是有意义的。在我们的现代世界中,人们可能只定义 M_PI 并收工,但其他变体仍然存在以实现向后兼容性。

【讨论】:

  • @SteveJessop:在以 2 为底的浮点数的平台(即我们关心的所有平台)上,它不会总是给你完全相同的结果吗? (即,它将是M_PI,指数加 1)
  • 注意不要混淆:M_2_PI 定义为 2/pi。
  • @stevejessop:乘以 2 是准确的(除非溢出,这里显然不会发生)
  • @Dietrich:是的,我觉得我很愚蠢。
  • (请注意,除以二也是精确的;M_PI_2 也不买任何准确性。)
【解决方案2】:

这只是我的猜测。

我想这些常量与数学库中不同函数的实现有关:

ck@c:~/Codes/ref/glibc/math$ grep PI *.c
s_cacos.c:  __real__ res = (double) M_PI_2 - __real__ y;
s_cacosf.c:  __real__ res = (float) M_PI_2 - __real__ y;
s_cacosh.c:                    ? M_PI - M_PI_4 : M_PI_4)
...
s_clogf.c:      __imag__ result = signbit (__real__ x) ? M_PI : 0.0;
s_clogl.c:      __imag__ result = signbit (__real__ x) ? M_PIl : 0.0;
ck@c:~/Codes/ref/glibc/math$ 

M_PIM_PI_2M_PI_4 经常出现,但没有 2.0 * M_PI。所以对于 Hanno 最初的问题,我认为 MvanGeest 是对的 --- 2π 并没有那么有用,至少在实现 libm 时。

现在关于M_PI_2M_PI_4,它们的存在是有充分理由的。 GNU C 库的documentation 表明“这些常量来自 Unix98 标准并且在 4.4BSD 中也可用”。那个时候编译器还没有那么聪明。键入 M_PI/4 而不是 M_PI_4 可能会导致不必要的除法。尽管现代编译器可以对此进行优化(gcc 从 2008 年开始使用 mpfr,因此即使舍入也可以正确完成),但使用数字常量仍然是编写高性能代码的一种更便携的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 2016-02-17
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多