2017-06-10 5 views
4

0.5は、2の(負の)累乗であり、IEEE-754バイナリ浮動小数点フォーマットによって正確に表現できることを意味します。 signle精度では0'01111110'00000000000000000000000です。0.5 * x + 0.5 * x == xというのはいつも真実だと言えますか?

の場合、y + y == xの場合、最適化をオフにしたクイックテスト(-O0)に基づいています。しかし、IEEE-754規格では常に保証されていますか?

私はnは正の整数2のパワー、及びm = 1.0/ny = m * xある場合、一般的には、一緒にnyを追加するxを生成しないことを知っています。しかし、それはn = 2はいと思われる。

私は何か不足していますか?

+1

[浮動小数点数学は壊れていますか?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) – mehulmpt

+4

@mehulmptその質問は「0.2 + 0.1!= 0.3 "であり、これは2進浮動小数点フォーマットでは0.2と0.1が正確に表現できないので完全に明らかです。私はあなたがここの違いを理解していないと思う。 – plasmacel

答えて

6

いや、ここdouble単精度浮動ポイントと平凡な反例である:IEEE-754の下

double x = 4.9E-324; // minimum positive value 
double y = x * 0.5; // this doesn't only look like a zero this positive zero all 0 bits 
bool test = y + y == x; // false 

浮動小数点数は精度が限られている、と2で割るとき、私たちは情報を失うことができます。ほとんどの場合、数値を小さくすると正確さが増しますが、指数を下げることはできますが、上記のようにこれは必ずしも十分ではありません。指数を下げることはできません。

最小の指数と奇数の仮数を持つものは、等価を保持しません。このような例はx = 5.0E-322です。

+0

ええ、最小値は確かに反例です。 – plasmacel

+1

最小の指数と奇数のmantisaを持つもの。 5.0E-322 –

+0

ニース!これを答えに加えてください。 – plasmacel

関連する問題