我刚刚让 Apple 的 C/C++ 编译器将浮点数初始化为非零值(大约“-0.1”)。
这是一个很大的惊喜 - 只是偶尔发生(但 100% 可重复,如果您事先运行相同的函数调用/参数)。追踪(使用断言)花了很长时间。
我认为浮点数是零初始化的。谷歌搜索表明我在考虑 C++ (当然,这对这些东西更精确 - cf SO: What is primitive types default-initialized to in C++?)。
但也许 Apple 的借口是他们的编译器在 C 模式下运行……那么:C 呢?应该发生什么,以及(更重要的是)什么是典型的?
(当然,我应该手动初始化它——我通常会这样做——但在这种情况下我失败了。不过我没想到它会爆炸!)
(事实证明,谷歌在讨论这个问题时比没用更糟糕——他们当前的搜索拒绝在没有“C++”的情况下显示“C”。一直认为我太愚蠢了,甚至在高级模式下运行时也忽略了我的输入)
这是它发生的实际源示例。起初我认为 MAX 和 ABS 的定义可能存在问题(也许 MAX(ABS,ABS) 并不总是像你期望的那样?)......但是用断言和调试器挖掘,我最终发现它是缺失的初始化 - 浮点数偶尔会被初始化为非零值):
float crossedVectorX = ... // generates a float
float crossedVectorY = ... // generates a float
float infitesimal; // no manual init
float smallPositiveFloat = 2.0 / MAX( ABS(crossedVectorX), ABS(crossedVectorY));
// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive
infitesimal += smallPositiveFloat;
NSAssert( infitesimal >= 0.0, @"This is sometimes NOT TRUE" );