2012-12-03 3 views
23

intがある場合はdoubleに変換し、doubleintに戻して変換すると、最初から同じ値を返すことになりますか?int-> double-> intは、値を保持することが保証されていますか?

int passThroughDouble(int input) 
{ 
    double d = input; 
    return d; 
} 

アムは、私がpassThroughDouble(x) == xすべてのためintxことが保証:他の言葉では、この機能を与えられましたか?

+0

intのサイズによって異なります。 64ビット整数の場合、これは間違いなく機能しません。 32ビットintの場合、*おそらく*動作します。 –

+1

'assert(std :: numeric_limits :: digits <= std :: numeric_limits :: digits); - http://en.cppreference.com/w/cpp/types/numeric_limits/digits – sehe

+1

@sehe:確かに'static_assert'を意味します。 :P – GManNickG

答えて

30

いいえ、それはありません。標準では、intdoubleの相対サイズについては何も言及していません。

intが64ビット整数でdoubleがIEEEの倍精度標準である場合、2^53より大きい数値では既に失敗します。


つまり、今日の環境ではintはまだ32ビットです。だからまだ多くの場合保持されます。

+0

どのシステムでintが64ビットを持っていますか? WindowsとLinuxはともに32bitで動作します。 –

+0

私はCがIEEE倍精度を言うとは思わない。それはちょうど倍精度を言う。浮動小数点の精度の2倍を意味します。だから、64ビットintは2倍に正確に一致するかもしれません(明確に保証されていません) – pm100

+0

@ JohannesSchaub-litb 64ビットのint型のLinuxディストリビューションについて聞いたことがあります。しかし、それは私がラウンジから得た中古情報でした。 – Mysticial

12

従来のIEEE-754形式の浮動小数点型の表現に限定すると、doubleの仮数にビット数が多い場合にのみ、この変換が値を保持すると期待できますintに符号なしビットがあるためです。

古典的なIEEE-754 doubleタイプの仮数は、53ビット幅(「暗黙の」先頭ビットを含む)です。つまり、[-2^53, +2^53]の範囲の整数を正確に表すことができます。この範囲外のものはすべて一般に精度を失います。

したがって、あなたのintとあなたのdoubleの広さによって異なります。答えは、特定のプラットフォームに依存します。 32ビットのintとIEEE-754 doubleでは、同等性が保持されます。

+0

デジタルオーディオシステムは、整数から浮動小数点から整数への変換に依存します。「世界は回転を停止します。トピックの理論を掘り下げ、実践的な実験を行う必要があった人として、これは正しい答えだとしか言えません。 – Izhaki

関連する問題