2

わかりました。一般的に、2つの浮動小数点数が等しいかどうかを比較することは想定されていません。しかし、William Kahanの「浮動小数点計算における丸めのマインドレス評価はどれほど無駄ですか?」彼は次のコードを示しています(擬似コード、私は信じています):

Real Function T(Real z) :
      T := exp(z) ;                       ... rounded, of course.
      If (T = 1) Return( T ) ;            ... when |z| is very tiny.
      If (T = 0) Return( T := –1/z ) ;    ... when exp(z) underflows.
      Return( T := ( T – 1 )/log(T) ) ;   ... in all other cases.
      End T .

今、私はこれをCまたはC ++で実装することに興味があり、2つの関連する質問があります。

a)Tをdoubleとすると、比較では(T == 1)または(T == 0)は0と1がdoubleに変換され、マルチタイプ式に含まれる値の精度が維持されます。 ?

b)これは、2つの浮動小数点数を比較して等しいと見なされますか?

4

2 に答える 2

3

はい、はい。

32ビットintの場合、doubleすべての値を正確に表すことができます。ただし、doubleを64ビットintと比較すると、intが2 ^ 52より大きい場合、丸め誤差が発生する可能性があります。long doubleただし、少なくとも64ビットの仮数を持つものを使用できます。

もちろん、最良の方法は、浮動小数点リテラルを使用することです。1.0または、1.タイプがdouble、であり、想定されるタイプが何であれ:v)です。1.0ffloatmy_float_type(1)

于 2010-09-25T07:32:16.947 に答える
1

整数はdoubleに変換されます。

セクション5の冒頭にあるC++標準の式を参照してください。

浮動小数点数に正確な値が含まれていることがわかっている場合は、不正確な表現について心配する必要はありません。

符号なし整数は、仮数+ 1ビットに収まる限り、浮動小数点数として正確に表すことができます。符号付き整数の場合は、仮数+ 2ビットです(最も負の整数を除き、32ビット整数の場合は2 -31 )。

分母の2の累乗の分数も正確に表すことができます。

于 2010-09-25T08:07:05.003 に答える