私はcの初心者です。そのため、小さなゲームのデモを書いていると、本当に奇妙な問題に直面します。
void testC()
{
float a = 825300160;
float b = a + 0.1;
assert(a != b);
}
上記の assert ステートメントを渡すことはできません。非常に奇妙な。
私の環境はmac os mlです。gcc 4.2.1
私はcの初心者です。そのため、小さなゲームのデモを書いていると、本当に奇妙な問題に直面します。
void testC()
{
float a = 825300160;
float b = a + 0.1;
assert(a != b);
}
上記の assert ステートメントを渡すことはできません。非常に奇妙な。
私の環境はmac os mlです。gcc 4.2.1
a の小数部分はfloat
23 ビットで構成されます。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
float 型では十分な精度がありません。825300160 のような大きな数に 0.1 を加算したことを本当に区別する必要がある場合は、double を使用してください。
このサイトが示すように、a と b の両方が次のように表されます。
0 10011100 10001001100010001010011
float の IEEE 標準では、最初のビットが符号、次の 8 が指数、残りの 23 が仮数です。指数が非常に大きいため、これらの 23 ビットでは差を表すのに十分なスペースがありません。