【发布时间】:2012-04-10 21:31:56
【问题描述】:
我刚刚让 Apple 的 C/C++ 编译器将浮点数初始化为非零值(大约“-0.1”)。
这是一个很大的惊喜 - 只是偶尔发生(但 100% 可重复,如果您事先运行相同的函数调用/参数)。追踪(使用断言)花了很长时间。
我认为浮点数是零初始化的。谷歌搜索表明我在考虑 C++(当然,这对这些东西更精确 - c.f. SO:What are primitive types default-initialized to in C++?)。
但也许 Apple 的借口是他们的编译器在 C 模式下运行……那么:C 呢?应该发生什么,(更重要的是)什么是典型的?
(当然我应该手动初始化它 - 我通常会这样做 - 但在这种情况下我失败了。不过我没想到它会爆炸!)
(事实证明,Google 对此的任何讨论都比毫无用处更糟糕——他们当前的搜索拒绝在没有“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" );
【问题讨论】:
-
取决于“初始化”发生的位置 - 可能根本没有初始化。
-
添加了我看到问题的源代码的复制/粘贴。在我看来,它应该被初始化?
-
+1 提出一个每个人都最好知道答案的问题。