1

フロートの範囲が広いほど、低い範囲よりも乗算/除算/加算/減算の精度が高くなりますか。

たとえば、 ?567.56 / 345.54よりも正確.00097854 / .00021297でしょうか?

4

4 に答える 4

4

あなたの質問に対する答えは「いいえ」です。浮動小数点数は(通常*)正規化された仮数と指数で表されます。乗算と除算は、最初に正規化された仮数で動作し、次に指数で動作します。

もちろん、足し算と引き算は別の話です。あなたの例のような操作:

 567.56 + 345.54 or .00097854 - .00021297

うまくいきます。しかし、次のような桁違いの操作

 567.56 + .00097854    or  345.54  - .00021297

低次の精度が失われる可能性があります。

  • IEEE浮動小数点標準には、非正規化数が含まれています。あなたが天体物理学者またはランタイムライブラリ開発者である場合、あなたはそれらを理解する必要があるかもしれません。http://en.wikipedia.org/wiki/Denormal_numberを参照してください
于 2012-08-06T22:04:04.920 に答える
1

完全を期すために、私は少し意見を異にし、「はい」と言わなければなりません。確かに、それはどういうわけか重要かもしれません...
実際、56756.0 / 34554.0を実行すると、正確な数学的結果に最も近い表現可能な浮動小数点数が得られます。浮動小数点の丸め「エラー」。
これは、56756.0および34554.0が浮動小数点(単精度または倍精度IEEE 754)で正確に表現可能であり、IEEE 754標準に従って、演算が正確な丸め演算(デフォルトモードで最も近い)を実行するためです。

567.56 / 345.54と書くと、両方の数値が基数2の浮動小数点で正確に表されないため、この操作の結果、3つの浮動小数点の丸め「エラー」が累積されます。

Squeak Smalltalkの結果を倍精度(Float)で比較し、正確な算術演算(分子と分母に任意の整数の長さの分数)に変換してみましょう。

((56756.0 / 34554.0) asFraction - (56756 / 34554)) asFloat.
-> -7.932275867322412e-17

これまでのところ、IEEE 754で約束されているように、エラーの大きさはulpの半分以下です。

(56756 / 34554) asFloat ulp / 2
-> 1.1102230246251565e-16

累積丸め誤差を使用すると、より大きな誤差が発生する可能性があります(ただし、決して小さくなることはありません)。

((567.56 / 345.54) asFraction - (56756 / 34554)) asFloat
-> -3.0136736359825544e-16

((0.00056756 / 0.00034554) asFraction - (56756 / 34554)) asFloat
-> 3.647664511768385e-16

上記の例を一般化するのは難しいです、そして私は他の答えに完全に同意します:一般的に、いいえ、あなたは相対的な精度だけに注意を払うべきです。
...丸め誤差について非常に厳密な許容範囲を持つ関数を実装したい場合を除いて、...

于 2012-08-13T13:49:31.483 に答える
1

IEEE 754 2進浮動小数点数(最も一般的)の場合、浮動小数点値は、ほとんどの指数範囲で仮数に同じビット数を持ちます。ただし、仮数のビット数が事実上少ない範囲の一部があります。また、丸めによって生じる相対誤差は、仮数がその範囲内のどこにあるかによって異なります。

IEEE 754浮動小数点数は、符号(+1または-1、0または1としてエンコード)、指数(倍精度の場合、-1022〜1023、指数に1023を加えたものとしてエンコードされるため、1〜2046)で表されます。 、および仮数(倍精度の場合、通常1から2のすぐ下までの小数部は、53ビットで表されますが、最初のビットは暗黙的に1であるため、52ビットでエンコードされます)。

たとえば、数値6.5は、ビット0(符号+1)、10000000001(指数2)、および1010000000000000000000000000000000000000000000000000(2進数の小数部1.1010、16進数の1.a、10進数の1.3125)でエンコードされます。これは、16進数の浮動小数点で0x1.ap2(16進数の分数1.aに2を10進数の2の累乗で乗算したもの)と書くことができます。16進浮動小数点で記述することにより、人間は浮動小数点表現をかなり簡単に見ることができます。

指数の場合、0と2047のエンコード値は特別です。エンコーディングが0の場合、指数はエンコーディングが1(-1022)の場合と同じですが、小数部の暗黙のビットは1ではなく0です。エンコーディングが2047の場合、浮動小数点オブジェクトは無限大を表します(if仮数ビットはすべてゼロ)またはNaN(それ以外の場合)。

エンコードされた指数が0で、仮数ビットがすべてゼロの場合、数値はゼロを表します(+0と-0は符号で区別されます)。仮数ビットがすべてゼロでない場合、その数は非正規化されていると言われます。これは、ほとんどの数値が、分数が1(包括的)と2(排他的)の間にあるように指数を調整することによって「正規化」されるためです。非正規化数の場合、分数は1未満です。「0」で始まります。「1.」の代わりに。

浮動小数点演算の結果が非正規化数である場合、仮数のビット数は事実上少なくなります。したがって、数値が0x1p-1022(2 -1022)を下回ると、実効精度が低下します。

数値が正規化数の範囲内にある場合(非正規化数にアンダーフローせず、無限大にオーバーフローしない)、指数が異なる数値の仮数に違いはありません。したがって、次のようになります。

  • (2a + 2b)/2の結果はa+bとまったく同じです。
  • (2a-2b)/2の結果はabとまったく同じです。
  • (2ab)/2の結果はabとまったく同じです。

ただし、相対誤差は変化する可能性があることに注意してください。浮動小数点演算を実行する場合、正確な数学的結果を表現可能な値に丸める必要があります。この丸めは、仮数で表すことができる単位でのみ発生します。与えられた指数に対して、仮数のビットは固定値を持ちます。したがって、仮数の最後のビットは特定の値を表します。その値は、2に近い仮数よりも、1に近い仮数の大部分です。

倍精度の結果の場合、最小精度の単位(ULP)は、仮数の最大ビットの値の252の1部分です。ラウンドトゥニアレストモード(最も一般的なデフォルト)を使用する場合、最大のエラーは最大でその半分です。これは、一方向の表現可能な数がULPの半分以上離れている場合、他の方向の数が少なくなるためです。 ULPの半分以上離れています。そして、より近い数値は、適切な浮動小数点演算によって返されます。

したがって、仮数が1に近い結果の最大相対誤差は2 -53をわずかに上回りますが、仮数が2に近い結果の最大相対誤差は2-54をわずかに下回ります。

于 2012-08-08T16:54:55.990 に答える
0

いいえ。数値の桁数(指数部分)に関係なく、有効桁数が同じであるという意味で。

于 2012-08-06T21:57:18.560 に答える