我刚刚让苹果的C/C++编译器将一个浮点数初始化为非零值(大约是“-0.1”)。这让我很惊讶,而且只有偶尔发生(但如果您先运行相同的函数调用/参数,就会100%地重复发生)。使用断言花费了很长时间来跟踪它。
我原以为浮点数被初始化为零。谷歌搜索表明我在想C++(当然,它对这些东西更精确 - 参见SO:C ++中的原始类型默认初始化为什么?)。
但也许苹果的借口是他们的编译器在C模式下运行...那么:C怎么样?应该发生什么,(更重要的是)什么是典型的?
(当然,我应该手动初始化它 - 我通常这样做 - 但在这种情况下,我失败了。虽然我没有预料到它会崩溃!)
(谷歌对于任何关于此的讨论都毫无用处 - 它们当前的搜索拒绝显示“C”而不包括“C ++”。它一直认为我太蠢,并忽略了我的输入,即使在高级模式下运行也是如此)
这是发生问题的实际源示例。起初,我认为可能存在MAX和ABS的定义问题(也许MAX(ABS,ABS)并不总是做您期望的事情?)...但是通过断言和调试器挖掘,我最终发现它是缺少初始化 - 那个浮点数极少情况下被初始化为非零值:
我原以为浮点数被初始化为零。谷歌搜索表明我在想C++(当然,它对这些东西更精确 - 参见SO:C ++中的原始类型默认初始化为什么?)。
但也许苹果的借口是他们的编译器在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" );