M_PI和M_PI_2之间的区别是什么?

时间:2017-05-03 07:27:11

标签: swift

我从Github分叉了一个项目,Xcode显示了很多警告:

  

' M_PI'已弃用:请使用' Double.pi'或者' .pi'获得价值   正确的类型,避免铸造。

  

' M_PI_2'已弃用:请使用' Double.pi'或者' .pi'获得价值   正确的类型,避免铸造。

由于提示M_PI_2Double.pi都被switch angle { case M_PI_2: ... case M_PI: ... case Double.pi * 3: ... default: ... } 替换,我认为实际上存在相同的值。但是,项目中有以下代码:

M_PI

我真的很困惑,M_PI_2Double.pi / 2有什么不同?还是他们一样?

更新:

事实证明这是我的错误,Xcode表示,M_PI_2'已弃用:请使用.pi / 2"405-048011-62815", "CRC Industries", "630-0746","Dixon value", "4444-444","3M INdustries", "555-55","Dixon coupling valve" 获取正确类型的值并避免转换。所以它不是一个错误,太难以注意到2个提示的区别。

3 个答案:

答案 0 :(得分:13)

Double.pi / 2用于M_PI_2,将Double.pi用于M_PI。

您还可以使用Float.piCGFloat.pi

在Swift 3& 4,pi被定义为浮点数类型DoubleFloatCGFloat的静态变量。

答案 1 :(得分:0)

M_PI被定义为宏

#define M_PI   3.14159265358979323846264338327950288

在math.h中,是POSIX标准的一部分。

关注这个 You can find reference answer here

Check This Solution - How you can use it

答案 2 :(得分:0)

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

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;

M_PI,M_PI_2和M_PI_4经常出现,但没有2.0 * M_PI。 2π并没有那么有用,至少在实现libm时是这样。

M_PI_2和M_PI_4,它们的存在是合理的。 GNU C库的文档表明“这些常量来自Unix98标准,也可以在4.4BSD中获得”。那时编译器并不那么聪明。键入M_PI / 4而不是M_PI_4可能会导致不必要的划分。虽然现代编译器可以对其进行优化(自2008年以来GCC使用mpfr,因此即使正确完成舍入),使用数字常量仍然是编写高性能代码的更便携方式。