すべての整数値は Double として完全に表現されますか?
すべての整数値が次のように完全に表現されることが保証されるかどうかという疑問が生じます。倍精度浮動小数点数。これに答えるために、まず double の表現を詳しく調べます。
double は仮数 * 2^指数として表され、仮数には小数桁が含まれます。これにより、整数値と 10 進数値の両方の表現が可能になります。
32 ビット整数の表現
32 ビット整数の場合、最大 53 ビットが使用可能です。仮数。これは、小数部分の損失なしにすべての可能な 32 ビット整数を表すのに十分です。したがって、はい、すべての 32 ビット整数値は double として完全に表現されます。
64 ビット整数の表現
ただし、64 ビット整数の場合、状況はは異なります。 IEEE 754 倍精度では、最大 53 ビットの完全な表現を保証できます。それを超えると、丸め誤差が生じる可能性があります。したがって、いいえ、すべての 64 ビット整数値が double として完全に表現されるわけではありません。
動作を経験的に検証する
次のコード スニペットは、整数から double への変換をテストします。 :
<code class="cpp">#include <iostream> #include <limits> using namespace std; int main() { double test; volatile int test_int; for (int i = 0; i < numeric_limits<int>::max(); i++) { test = i; test_int = test; if (test_int != i) cout << "found integer i=" << i << ", test=" << test << endl; } return 0; }</code>
このコードを実行すると、32 ビット整数の小数変換エラーのある整数値がないことがわかります。ただし、64 ビット整数の場合、小数点の差を使用して double に変換し、元の整数値に丸める整数値を見つけることができます。
小数点の差
変換中に小数点以下の差異が発生する可能性については、整数の場合はまだ答えはノーです。これは、仮数 * 2^exponent として表される double 値間のステップ幅が常に 2 のべき乗であるためです。したがって、2 つの double 値の間に 2 より小さい差はなく、丸めの問題は解決されます。
以上がすべての整数値を double として完全に表現できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。