我从Github分叉了一个项目,Xcode显示了很多警告:
' M_PI'已弃用:请使用' Double.pi'或者' .pi'获得价值 正确的类型,避免铸造。
和
' M_PI_2'已弃用:请使用' Double.pi'或者' .pi'获得价值 正确的类型,避免铸造。
由于提示M_PI_2
和Double.pi
都被switch angle {
case M_PI_2:
...
case M_PI:
...
case Double.pi * 3:
...
default:
...
}
替换,我认为实际上存在相同的值。但是,项目中有以下代码:
M_PI
我真的很困惑,M_PI_2
和Double.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个提示的区别。
答案 0 :(得分:13)
将Double.pi / 2
用于M_PI_2,将Double.pi
用于M_PI。
您还可以使用Float.pi
和CGFloat.pi
。
在Swift 3& 4,pi被定义为浮点数类型Double
,Float
和CGFloat
的静态变量。
答案 1 :(得分:0)
M_PI被定义为宏
#define M_PI 3.14159265358979323846264338327950288
在math.h中,是POSIX标准的一部分。
答案 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,因此即使正确完成舍入),使用数字常量仍然是编写高性能代码的更便携方式。