4

これはプログラミングの質問というよりは数値分析ですが、あなた方の何人かはそれに答えることができると思います。

2つのフロートの合計で、精度が失われていますか?なんで?

浮動小数点数と整数の合計で、精度が失われることはありますか?なんで?

ありがとう。

4

9 に答える 9

7

2つのフロートの合計で、精度が失われていますか?

両方のフロートの大きさが異なり、両方が完全な精度範囲(小数点以下約7桁)を使用している場合は、はい、最後の場所でいくらかの損失が見られます。

なんで?

これは、フロートが(符号)(仮数)×2 (指数)の形式で格納されるためです。2つの値の指数が異なり、それらを加算すると、小さい値は仮数の桁数が少なくなります(大きい方の指数に適応する必要があるため)。

PS> [float]([float]0.0000001 + [float]1)
1

浮動小数点数と整数の合計で、精度が失われることはありますか?

はい、通常の32ビット整数は、floatに正確に適合しない値を正確に表すことができます。フロートはほぼ同じ数を格納できますが、正確には格納できなくなります。もちろん、これは十分に大きい数にのみ適用されます。e。24ビットより長い。

なんで?

floatの精度は24ビットで、(32ビット)整数の精度は32であるため、floatは引き続き大きさと有効数字のほとんどを保持できますが、最後の桁は異なる可能性があります。

PS> [float]2100000050 + [float]100
2100000100
于 2009-12-15T12:33:03.813 に答える
3

精度は、元の数値の大きさに依存します。浮動小数点では、コンピューターは数値312を科学的記数法として内部的に表します。

3.12000000000 * 10 ^ 2

左側(仮数)の小数点以下の桁数は固定されています。指数には上限と下限もあります。これにより、非常に大きい数または非常に小さい数を表すことができます。

大きさが同じ2つの数値を追加しようとすると、小数点を移動する必要がないため、結果の精度は同じままである必要があります。

312.0 + 643.0 <==>

3.12000000000 * 10 ^ 2 +
6.43000000000 * 10 ^ 2
-----------------------
9.55000000000 * 10 ^ 2

非常に大きい数と非常に小さい数を追加しようとすると、上記の形式に圧縮する必要があるため、精度が低下します。312 + 12300000000000000000000を検討してください。最初に、小さい数値をスケーリングして大きい数値に合わせる必要があります。次に、次を追加します。

1.23000000000 * 10 ^ 15 +
0.00000000003 * 10 ^ 15
-----------------------
1.23000000003 <-- precision lost here!

浮動小数点は、非常に大きい数または非常に小さい数を処理できます。ただし、両方を同時に表すことはできません。

intとdoubleを追加する場合、intはすぐにdoubleになり、上記が適用されます。

于 2009-12-15T12:40:54.690 に答える
2

2つの浮動小数点数を加算する場合、通常、エラーが発生します。D.ゴールドバーグの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」では、効果と理由、およびエラーの上限を計算する方法、およびより複雑な計算の精度について推論する方法について説明しています。

整数にfloatを追加する場合、整数は最初にC ++によってfloatに変換されるため、2つのfloatが追加され、上記と同じ理由でエラーが発生します。

于 2009-12-15T12:35:16.760 に答える
1

2つのフロートの合計で、精度が失われていますか?浮動小数点数と整数の合計で、精度が失われることはありますか?なんで?

常にではない。合計が要求した精度で表現可能であり、精度が低下しない場合。

例:0.5 +0.75=>精度の低下なしx*0.5 =>精度の低下なし(xが小さすぎる場合を除く)

一般的なケースでは、わずかに異なる範囲で浮動小数点数を追加するため、実際には丸めモードに依存する精度の低下があります。つまり、範囲がまったく異なる数値を追加する場合は、精度の問題が予想されます。

非正規化数は、CPUを犠牲にして、極端な場合に超精度を与えるためにここにあります。

コンパイラが浮動小数点計算を処理する方法に応じて、結果は異なる場合があります。

厳密なIEEEセマンティクスでは、2つの32ビットフロートを追加しても32ビットよりも精度が高くなることはありません。実際には、それを確実にするためにより多くの指示が必要になる場合があるため、浮動小数点を使用した正確で再現可能な結果に依存するべきではありません。

于 2009-12-15T12:51:51.367 に答える
1

aで使用できる精度floatは限られているため、もちろん、特定の操作によって精度が低下するリスクが常にあります。

両方の質問に対する答えは「はい」です。

非常に大きなフロートを非常に小さなフロートに追加しようとすると、たとえば問題が発生します。

または、整数をfloatに追加しようとした場合、整数は、floatが仮数に使用できるよりも多くのビットを使用します。

于 2009-12-15T12:33:22.910 に答える
1

簡単な答え:コンピューターは限られたビット数で浮動小数点数を表します。これは多くの場合、仮数と指数で行われます。したがって、有効数字には数バイトのみが使用され、その他は小数点の位置を表すために使用されます。 。

(たとえば)10 ^ 23と7を追加しようとすると、その結果を正確に表すことができなくなります。floatとintegerを追加する場合も、同様の引数が適用されます。整数はfloatにプロモートされます。

于 2009-12-15T12:33:32.127 に答える
0

どちらの場合もそうです:

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );
于 2009-12-15T12:32:31.957 に答える
0

float + intの場合は、標準の変換がintに適用されるため、float+floatと同じです。float + floatの場合、実装は倍精度で加算を行うことを選択できるため、これは実装に依存します。もちろん、結果を保存するときに多少の損失が発生する可能性があります。

于 2009-12-15T12:35:07.087 に答える
0

どちらの場合も、答えは「はい」です。にを追加するintと、floatとにかく追加が行われる前に、整数が浮動小数点表現に変換されます。

理由を理解するために、この宝石を読むことをお勧めします:すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2009-12-15T12:38:30.747 に答える