首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么math.h定义了pi,pi/2,2/pi而不是2*pi?

为什么math.h定义了pi,pi/2,2/pi而不是2*pi?
EN

Stack Overflow用户
提问于 2012-11-17 08:55:23
回答 2查看 11.8K关注 0票数 25

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

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

避免舍入可能更昂贵的errors.

  • Avoiding运行时划分。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-17 13:13:34

这只是我的猜测。

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

代码语言:javascript
复制
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。因此,对于汉诺最初的问题,我认为MvanGeest是对的-2至少在实现libm方面,π没有那么有用。

现在关于M_PI_2M_PI_4,它们的存在是有充分理由的。GNU库的documentation建议“这些常量来自Unix98标准,并且在4.4BSD中也可用”。当时的编译器还不够聪明。键入M_PI/4而不是M_PI_4可能会导致不必要的划分。尽管现代编译器可以优化这一点(从2008年开始,gcc就使用了mpfr,因此即使是四舍五入也可以正确完成),但使用数值常量仍然是编写高性能代码的一种更可移植的方法。

票数 4
EN

Stack Overflow用户

发布于 2012-11-17 09:19:10

2*M_PI真的很难写吗?

严肃地说,曾几何时,当人们担心简单的编译器可能无法执行常量折叠和除法时代价高得令人望而却步时,拥有一个恒定的PI/2实际上是有意义的,而不是冒着运行时除法的风险。在我们的现代世界中,人们可能只会定义M_PI并结束它,但其他变体为了向后兼容而继续存在。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13426562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档