2012-03-01 4 views
1

私は2つのull変数を分割し、最も正確な結果を得たいと考えています。 これを行う最善の方法は何ですか?cpp division - 最も正確な結果を得るには?

すなわち5000000分の5000034 = 1.0000068

+0

オペランドの1つを「double」にキャストしてから分割しますか? – Jon

+2

「ull」とは何ですか? –

+0

ull = unsigned long long – BoBTFish

答えて

5

あなたが「最も正確な精度を」したい場合 - あなたは小数点演算を浮動することは避けてください。

大規模な十進数ライブラリ[通常はfixed point算術演算を実装しています]を使用して、求める精度を定義できます。

あなたは浮動小数点演算を避けるべきです.tが正確ではないからです。[すべての範囲で無限の数の数字を表すために有限のビット数があるので、いくつかのスライスが発生する必要があります。固定小数点演算[大10進ライブラリで通常実装されている]を使用すると、「オンザフライ」でより多くのビットを割り当てて、希望の精度で数値を表すことができます。浮動小数点の問題に
詳しい情報は、この[ビット高度]記事に見出すことができる:What Every Computer Scientist Should Know About Floating-Point Arithmetic代わりに(二重)(N)/ Dの

+0

参照は良好ですが、「最も正確な精度」は何も意味しません。また、通常はマシン「倍精度」が精度にとって最適な選択肢です。 –

+0

@JamesKanze: "最も正確な精度"はOPが求めているものですが、もちろん意味がありません.eまたはpiの "最も正確な精度"は何ですか?私は固定小数点演算を使用することを意味しました - 倍精度で取得するものとは異なり、浮動小数点とは異なり、得られる精度は**制御できます**。 – amit

0

、実行+((ダブル)(N 1 - D)/ D)

0

私は恐らく“最も正確な結果”は、多くは を意味するわけではありません。有限表現は、すべての実数を正確に表すことはできません。 表現の精度は、タイプ のサイズと内部表現のサイズによって異なります。ほとんどの実装では、doubleは に約17桁の精度を与えます。これは通常、入力よりも正確には複数の次数です 単一の被乗数または除算の場合は、通常 doubleです。 (2つの値の差が極端な場合は、 の加算と減算で問題が発生します)より精度の高いパッケージ(BigDecimal,BigFloat、 )が存在しますが、最終的に精度は によって制限されています。また、 はdoubleよりも遅く、 を使用するのが一般的(やや難しい)です(多くのオプションがあります)。たとえば、精度がどれくらいあるかは です。あなたの質問に対する唯一の真の答えは別の質問です: どの程度の精度が必要ですか?どのような操作のシーケンスがありますか? 丸め誤差が累積するため、doubleは大部分で十分ですが、 は1つの除算になります。 反復手順では問題が発生することがあります。このような場合、解決策は通常精度を高めるために ではありませんが、問題を回避する方法でアルゴリズムを変更するには です。 doubleで必要とする精度が得られる場合、 は任意の拡張タイプより優先して使用します。そうでない場合は、 が選択されていない場合は、既存の任意精度の ライブラリ(GMPなど)のいずれかを選択します。

(あなたはまた、丸めが処理される方法に問題がある可能性があります。 簿記目的のためには、例えば、ほとんどの管轄区域はmonitary値を四捨五入する方法に関する非常に厳しい 法律があり、そのルールは、10進演算の をベースとしています。そのような場合は、 の小数点以下の桁数に合わせて丸めを行う数値型が必要です。)

0

浮動小数点数はおそらく乗算と除算で最も正確ですが、整数と固定小数点数は加算と減算に最適です。これは、乗算と除算が浮動小数点数がより良く処理する大きさの順序を変更し、加算と減算は整数と固定小数点数がよりよく処理する何らかのステップであるという事実に従います。

整数を分割するときに最高の精度が必要な場合は、分子と分母を含むRationalNumberクラスを実装します。算術オーバーフローを避けるなら、この方法であなたの再調整は常に正確です。これには、分数形式で出力を受け入れる必要があります。

関連する問題