整数値を浮動小数点値に変換して元に戻すと、元の整数値と同じになりますか?
例えば:
unsigned x = 42;
double y = x;
unsigned z = y;
コンパイラが浮動小数点変換を最適化しないと仮定すると、常にtruex == z
と評価されますか?
浮動小数点変換の表現エラーは常に値の増加になると思います。したがって、浮動小数点値が整数値に変換されると、値は切り捨てられ、常に元の整数値になります。
私の仮定は正しいですか?
整数値を浮動小数点値に変換して元に戻すと、元の整数値と同じになりますか?
例えば:
unsigned x = 42;
double y = x;
unsigned z = y;
コンパイラが浮動小数点変換を最適化しないと仮定すると、常にtruex == z
と評価されますか?
浮動小数点変換の表現エラーは常に値の増加になると思います。したがって、浮動小数点値が整数値に変換されると、値は切り捨てられ、常に元の整数値になります。
私の仮定は正しいですか?
の IEEE 754 倍精度形式を想定するとdouble
、式は2 53までのすべての値に対してx == z
と評価されます。たとえば、コンパイラが 32 ビットを提供している場合、これは のすべての可能な値を意味します。1
x
unsigned int
x
質問を編集して、整数から浮動小数点数への変換について質問しました。ほとんどの C 実装では、この変換は FPU 丸めモードに従って丸められます。これはデフォルトで最も近い偶数に丸められます。float から integer への変換には非対称性があります (ご指摘のとおり、float から int への変換は常に切り捨てられます)。
ただし、integer から float への変換でエラーが発生しても、小数部分がないのに小数部分が得られるわけではなく、全体として間違った整数が得られることになります。たとえば、整数 2 53 +1 は2 53double
を表すに変換されます。このため、float から integer への変換が常に切り上げられる場合でも、float から integer への変換が切り捨てられることは役に立ちません。
整数から浮動小数点数への5555555555555555555
変換における丸め誤差は、1 よりも大きくなる可能性があります。半分の場合、丸めは上向きになります。たとえば、は に丸められます。double
5555555555555555328
5555555555555555855
5555555555555556352
2 53までの整数は、 double
IEEE-754 に従っている場合 (タグが示すように)、倍精度浮動小数点数として正確に表現されます。int
したがって、が 32 ビットであると仮定すると、はい、精度を失うunsigned
ことなく を に変換できます。double
浮動小数点倍精度型が 64 ビット IEEE754 型であると仮定しましょう。(C標準はこれを主張していませんが、タグ付けしたものです)。
のサイズによって異なりますunsigned int
。32 ビットの場合ははい、64 ビットの場合は必ずしもそうではありません。(カットオフは 53 番目のビットにあります。2 53 + 1 は、IEEE 浮動小数点では正確に表現できない最小の正数double
です。)
32 ビット プラットフォームでは、答えは常に「はい」です。
64 ビット プラットフォームでは、コンパイラに依存します。LP64 と LLP64 ではunsigned int
32 ビットですが、ILP64 では 64 ビットです。(Win64 は 32 ビットでも設定long
される LLP64 を使用することに注意してください)。