6

私はcの初心者です。そのため、小さなゲームのデモを書いていると、本当に奇妙な問題に直面します。

 void testC()
 {
     float a = 825300160;
     float b = a + 0.1;
     assert(a != b);
 }

上記の assert ステートメントを渡すことはできません。非常に奇妙な。
私の環境はmac os mlです。gcc 4.2.1

4

3 に答える 3

8

a の小数部分はfloat23 ビットで構成されます。825300160 を表すには 30 ビットが必要なので、数値の重要でない部分は削除されます。追加.1しても違いはありません32。数値を変更するには、大まかに追加する必要があります。

float a = 825300160;
float b = a + 31.5;
assert(a != b); // No change is detected
float c = a + 32;
assert(a != c); // Change is detected
于 2012-11-26T00:21:08.223 に答える
6

float 型では十分な精度がありません。825300160 のような大きな数に 0.1 を加算したことを本当に区別する必要がある場合は、double を使用してください。

于 2012-11-26T00:16:51.417 に答える
1

このサイトが示すように、a と b の両方が次のように表されます。

0 10011100 10001001100010001010011

float の IEEE 標準では、最初のビットが符号、次の 8 が指数、残りの 23 が仮数です。指数が非常に大きいため、これらの 23 ビットでは差を表すのに十分なスペースがありません。

于 2012-11-26T00:29:03.320 に答える