Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么math.h定义了π,π/2,2/pi而不是2*pi?_C_Math.h - Fatal编程技术网

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

C 为什么math.h定义了π,π/2,2/pi而不是2*pi?,c,math.h,C,Math.h,这是一个非常简单的问题:为什么有pi,pi/2,pi/4,1/pi和2/pi,而没有2*pi?这背后有更深层次的原因吗 这个问题不是关于整体的。我想知道实现某些常量而不是其他常量是否有技术原因。我可以想到两种可能性: 避免舍入误差 避免可能更昂贵的运行时划分 2*M_-PI这么难写吗 严肃地说,尽管曾经有一段时间,当人们担心简单的编译器可能无法进行常数折叠和除法的代价太高时,使用常数PI/2而不是冒着运行时除法的风险是有意义的。在我们的现代世界中,有人可能只定义mu PI并称之为day,但其他变

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

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

  • 避免舍入误差
  • 避免可能更昂贵的运行时划分

  • 2*M_-PI这么难写吗

    严肃地说,尽管曾经有一段时间,当人们担心简单的编译器可能无法进行常数折叠和除法的代价太高时,使用常数PI/2而不是冒着运行时除法的风险是有意义的。在我们的现代世界中,有人可能只定义mu PI并称之为day,但其他变体则是为了向后兼容而存在的。

    这只是我的猜测

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

    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$ 
    
    mupi
    mupi\u2
    mupi\u4
    经常出现,但没有
    2.0*mupi
    。所以对于Hanno最初的问题,我认为MvanGeest是正确的——2π并没有那么有用,至少在实现
    libm
    时是如此


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

    您想使用
    2*pi
    做什么?例如,大多数三角函数在
    2*pi
    之后“重复”(平移对称性为
    2*pi
    )。(更正式地说,例如,
    sin(a)=sin(b)
    if
    a=b(mod 2*pi)
    )这使得在用作这些函数参数的数字上加上或减去
    2*pi
    是没有用的。@mvangest有很多用例。那么正态分布、快速傅立叶变换、柯西积分呢?为什么它们不定义
    3*pi
    12*pi
    -4*pi
    ?这个问题要求的讨论没有明确的答案,除非
    math.h
    的一位原始作者碰巧过来回答。很抱歉,但投票结束并不具有建设性;特别提到讨论和推测类型的问题不适合这里的设计。@Ken:或者作者之一在别处已经回答过,有人可以找到答案并参考。我真的不明白为什么人们认为标准的基本原理问题是无法回答的——会议(有点)是有分钟的。我在乎,因为我每天大约输入100次这个常数。@SteveJessop:在以2为基数的浮点数平台上(即我们关心的所有平台),它不总是给你完全相同的结果吗?(也就是说,指数加1就是
    mu PI
    )小心不要混淆:mu 2pi被定义为2/PI。@stevejessop:2的乘法是精确的(除非溢出,这显然不会发生)@Dietrich:是的,我觉得我很愚蠢。(注意,除以2也是精确的;mu PI\u 2也不买任何精度。)