AppleのC/C ++コンパイラにfloatをゼロ以外の値(約「-0.1」)に初期化させました。
これは大きな驚きでした-そしてたまにしか起こりませんでした(ただし、同じ関数呼び出し/引数を事前に実行した場合は、100%繰り返します)。(アサーションを使用して)追跡するのに長い時間がかかりました。
フロートはゼロで初期化されていると思いました。グーグルは、私がC ++について考えていたことを示唆しています(もちろん、これについてははるかに正確です-cf SO:C ++でデフォルトで初期化されるプリミティブ型は何ですか?)。
しかし、ここでのAppleの言い訳は、コンパイラがCモードで実行されていたということかもしれません...だから:Cはどうですか?何が起こるべきか、そして(もっと重要なことに)典型的なことは何ですか?
(もちろん、手動で初期化する必要がありました-通常はそうします-しかし、この1つのケースでは失敗しました。ただし、爆発するとは思っていませんでした!)
(グーグルはこれについての議論には役に立たないよりも悪いことを証明しています-彼らの現在の検索は「C ++」なしで「C」を表示することを拒否します。私は愚かすぎると判断し続け、高度なモードで実行しているときでも私の入力さえ無視します)
これが実際に発生したソースの例です。最初は、MAXとABSの定義に問題があるのではないかと思いました(おそらくMAX(ABS、ABS)は必ずしも期待どおりに機能しないのでしょうか?)...しかし、アサーションとデバッガーを調べてみると、最終的には欠落していることがわかりました。初期化-そのfloatは非常に時々ゼロ以外の値に初期化されていました):
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" );