質問

私は、プログラムにCGFloat値を再帰的に追加しようとしていました。そして、私は、生成された合計が間違っている特定のシナリオで気付いたばかりです。プログラムロジックで何も悪いことではないことを確認するために、そのシナリオの簡単な例(以下を参照)を作成しましたが、これは同じ間違った値を印刷しました。

CGFloat arr[3] = {34484000,512085280,143011440};
CGFloat sum = 0.0;
sum = arr[0] + arr[1] + arr[2];

NSLog(@"%f",sum);

int arr1[3] = {34484000,512085280,143011440};
int sum1 = 0.0;
sum1 =  arr1[0] + arr1[1] + arr1[2];

NSLog(@"%d",sum1);

最初のnslogは689580736.000000を印刷します。正しい結果689580720。ただし、2番目のNSLOGは正しい結果を印刷します。これがバグなのか、それとも何か間違ったことをしているのかはわかりません。

ありがとう、ムラリ

役に立ちましたか?

解決

CGFloat iOSなどの32ビットターゲットに1つの精度フロートがあります。これは、23ビットマンティッサ、つまり6〜7桁前後しかありません。より高い精度が必要な場合は、二重精度タイプを使用します。

おそらくデビッド・ゴールドバーグの読み物を読むべきです すべてのコンピューター科学者が浮動小数点算術について知っておくべきこと プログラムの学習をさらに進める前に。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top