3

整数値を浮動小数点値に変換して元に戻すと、元の整数値と同じになりますか?

例えば:

unsigned x = 42;
double y = x;
unsigned z = y;

コンパイラが浮動小数点変換を最適化しないと仮定すると、常にtruex == zと評価されますか?

浮動小数点変換の表現エラーは常に値の増加になると思います。したがって、浮動小数点値が整数値に変換されると、値は切り捨てられ、常に元の整数値になります。

私の仮定は正しいですか?

4

3 に答える 3

10

の IEEE 754 倍精度形式を想定するとdouble、式は2 53までのすべての値に対してx == zと評価されます。たとえば、コンパイラが 32 ビットを提供している場合、これは のすべての可能な値を意味します。1xunsigned intx

質問を編集して、整数から浮動小数点数への変換について質問しました。ほとんどの C 実装では、この変換は FPU 丸めモードに従って丸められます。これはデフォルトで最も近い偶数に丸められます。float から integer への変換には非対称性があります (ご指摘のとおり、float から int への変換は常に切り捨てられます)。

ただし、integer から float への変換でエラーが発生しても、小数部分がないのに小数部分が得られるわけではなく、全体として間違った整数が得られることになります。たとえば、整数 2 53 +1 は2 53doubleを表すに変換されます。このため、float から integer への変換が常に切り上げられる場合でも、float から integer への変換が切り捨てられることは役に立ちません。

整数から浮動小数点数への5555555555555555555変換における丸め誤差は、1 よりも大きくなる可能性があります。半分の場合、丸めは上向きになります。たとえば、は に丸められます。double555555555555555532855555555555555558555555555555555556352

于 2013-11-22T15:05:46.860 に答える
2

2 53までの整数は、 doubleIEEE-754 に従っている場合 (タグが示すように)、倍精度浮動小数点数として正確に表現されます。intしたがって、が 32 ビットであると仮定すると、はい、精度を失うunsignedことなく を に変換できます。double

于 2013-11-22T15:05:59.103 に答える
0

浮動小数点倍精度型が 64 ビット IEEE754 型であると仮定しましょう。(C標準はこれを主張していませんが、タグ付けしたものです)。

のサイズによって異なりますunsigned int。32 ビットの場合ははい、64 ビットの場合は必ずしもそうではありません。(カットオフは 53 番目のビットにあります。2 53 + 1 は、IEEE 浮動小数点では正確に表現できない最小の正数doubleです。)

32 ビット プラットフォームでは、答えは常に「はい」です。

64 ビット プラットフォームでは、コンパイラに依存します。LP64 と LLP64 ではunsigned int32 ビットですが、ILP64 では 64 ビットです。(Win64 は 32 ビットで設定longされる LLP64 を使用することに注意してください)。

于 2013-11-22T15:10:39.653 に答える