2

重複の可能性:
IEEE 754浮動小数点数が正確に表現できない最初の整数はどれですか?

これは基本的な質問です。答えは「はい」です(int = 32ビット、double = 53ビット仮数+符号ビット)。

基本的に火を主張することができますか?

int x = get_random_int();
double dx = x;
int x1 = (int) dx;
assert(x1 ==x);
if  (INT_MAX-10>x)
 {
       dx+=10;
       int x2=(int) dx;
       assert(x+10 == x2);
 }

明らかに、除算などの複雑な式を含むもの((int)(5.0 / 3 * 3)は5/3 * 3と同じではありません)は機能しませんが、変換と加算/減算を行うのだろうか(オーバーフローが発生しない場合)同等性を維持します。

4

2 に答える 2

5

仮数のビット数が整数のビット数以上の場合、答えは「はい」ですあなたの質問では、の特定の既知のサイズintとの仮数を指定しますが、これは2003 C ++標準では保証されていないdoubleことを知っておくと便利です。これは、との仮数の相対的なサイズについては何も述べていません。intdouble

IEEE754浮動小数点演算を使用するためにCおよびC++は必要ないことに注意してください。2003C++標準の3.8.1/8によると、

浮動小数点型の値表現は実装定義です。

実際、C ++では、2進仮数を使用しない浮動小数点表現が許可されています。Cの場合、#include <limits.h>を使用して、基本型に関する情報を推測できます。特に、FLT_RADIX累乗DBL_MANT_DIGが、以上の場合INT_MAX、すべてのint値を正確に表すことができます。C ++では、関連する数量は、、numeric_limits<double>::radixおよびnumeric_limits<double>::digitsと呼ばれnumeric_limits<int>::max()ます。

2つの整数オペランドと、常に整数オペランドから整数を生成する演算(+または*、など/)が与えられると、すべてのIEEE754丸めモードは正確に整数を生成します。この整数がで表現可能である場合int(したがってdouble、仮数が少なくともと同じ幅であるという仮定を前提として、で正確に表現可能であるint場合)、対応する整数演算を使用して取得するのと同じ整数になります。賢明なFP実装は、IEEE 754に準拠していなくても、上記の保証を保持します。

于 2012-11-07T12:49:51.077 に答える
3

はい。すべてのNビットintは、少なくともN-1の仮数ビット(格納する必要のない暗黙の先頭の1ビットのため)と少なくともNを格納できる指数を持つ浮動小数点表現で表すことができます。log(N)+1ビット。

int32_tしたがって、31ビットの仮数、5ビットの指数、および1つの符号ビットを含む浮動小数点値に格納できます。これは、一般的なものには適合しますが、には適合しdoubleませんfloat。逆に、仮数が24ビットしかないaは、最大25ビット(つまり+/- 33,554,431)のsfloatしか正確に格納できません。int

于 2012-11-07T12:39:06.990 に答える