質問

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

合計2つのフロートでは、精度が失われましたか?なんで?

フロートと整数の合計で、精度は失われていますか?なんで?

ありがとう。

役に立ちましたか?

解決

合計2つのフロートでは、精度が失われましたか?

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

なんで?

これは、フロートが(サイン)(マンティッサ)×2の形で保管されているためです(指数). 。 2つの値に異なる指数があり、それらを追加すると、マンティッサの値が少なくなります(より大きな指数に適応する必要があるため):

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

フロートと整数の合計で、精度は失われていますか?

はい、通常の32ビット整数は、フロートに正確に収まらない値を正確に表すことができます。フロートは引き続き保存できます 同じ番号ですが、もはや正確ではありません。もちろん、これは十分に大きい数値にのみ適用されます。 e。 24ビット以上。

なんで?

フロートには24ビットの精度があり、(32ビット)整数には32があります。フロートはまだ大きさと大幅な数字のほとんどを保持できますが、最後の場所はおそらく異なる場合があります。

PS> [float]2100000050 + [float]100
2100000100

他のヒント

精度は、元の数値の大きさに依存します。浮動点では、コンピューターは科学表記として内部的に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とダブルスが追加されると、INTはすぐにダブルになり、上記が適用されます。

2つのフローティングポイント番号を追加するとき、通常、いくつかのエラーがあります。 D.ゴールドバーグ 「すべてのコンピューター科学者が浮遊点の算術について知っておくべきこと」 効果と理由を詳細に説明し、エラーの上限を計算する方法、およびより複雑な計算の精度について推論する方法についても説明します。

整数にフロートを追加すると、整数は最初にC ++によってフロートに変換されるため、上記と同じ理由で2つのフロートが追加され、エラーが導入されます。

で利用可能な精度 float 限られているため、もちろん、特定の操作が精度を低下させるリスクは常にあります。

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

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

または、フロートに整数を追加しようとすると、整数がフロートがマンティッサで利用できるよりも多くのビットを使用します。

短い答え:コンピューターは、限られた数のビットを持つフロートを表します。 マンティッサと指数, 、したがって、かなりの数字に使用されるのは数バイトのみであり、他のバイトは小数点の位置を表すために使用されます。

(たとえば)10^23と7を追加しようとした場合、その結果を正確に表すことができません。フロートと整数を追加するときに同様の議論が適用されます - 整数はフロートに宣伝されます。

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

常にではない。合計が尋ねる精度で表現可能である場合、精度の損失は得られません。

例:0.5 + 0.75 =>精密損失なしx * 0.5 =>精密損失なし(xが小さい場合を除く)

一般的なケースでは、わずかに異なる範囲にフロートを追加するため、実際に丸めモードに依存する精密損失があります。 IE:まったく異なる範囲の数字を追加する場合は、精度の問題を期待してください。

CPUを犠牲にして、極端な場合に追加の精度を与えるために、非定則がここにあります。

コンパイラがフローティングポイントの計算を処理する方法に応じて、結果は異なります。

厳密なIEEEセマンティクスでは、2つの32ビットフロートを追加すると、32ビットよりも優れた精度が得られないはずです。実際には、それを確実にするためにより多くの指示が必要になる場合があるため、浮動小数点で正確で繰り返し可能な結果に依存しないでください。

どちらの場合もはい:

assert( 1E+36f + 1.0f == 1E+36f );
assert( 1E+36f + 1 == 1E+36f );

標準変換がINTに適用されるため、Case Float + IntはFloat + Floatと同じです。 Float + Floatの場合、実装が2倍の精度で追加を行うことを選択する可能性があるため、これは実装に依存します。もちろん、結果を保存するときにある程度の損失があるかもしれません。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top