2012-02-08 6 views
3

私は2つの整数変数partialtotalを持っています。進行中ですので、partialはゼロから開始し、1つずつ、totalの値に上がります。二重にキャストせずに2つの整数を割り算

私が(0.0から1.0へ)進行状況を示す分数の値を取得したい場合は、私は次の操作を行うことがあります。

double fraction = double(partial)/double(total); 

しかし合計が大きすぎる場合、倍にする変換が情報を失う可能性があります。

実際には、失われた情報の量は許容されますが、2つの値の間の分数を減らして情報を失うアルゴリズムまたは標準機能があるのだろうかと思いました。

+3

'double'は53ビットの仮数を持っています - あなたは' total'が> 53ビットかもしれないと言っていますか? –

+6

'partial'と' total'のデータ型は何ですか? IIRCの「double」は、精度を損なうことなく32ビット整数を任意の値に保持できます。 –

+1

まあ、 'total'は'> 2^53'の値を持つ必要があります。これは10進数で約16桁の数字です。私は本当にあなたがそのような大きな数字を持っているのだろうかと思います。この場合、私はあなたの整数が64ビット幅であることを願っています。そうでなければ、最初は十分ではありません。 –

答えて

7

明らかな答えは、partialに倍率を掛けることです。部門は として百分率を返します(切り捨て)ので、 100が頻繁に選択されます。問題は、値が の場合には、doubleで正確に表すことができないほど大きい場合は、 もあります。スケーリング係数による乗算が オーバーフローになる可能性があります。 (その場合、それらが大きければ、最初の値 はほとんどのマシンでintをオーバーフローします)。

0

正確な表現をしたい場合は、分子分母を整数として扱い、ユニークな表現のためには、最大公約数(ゼロの特別な場合)を除外します。反復操作後に浮動小数点表現が十分正確ではないことが心配ならば、その問題は厳密にプログラミングの問題ではなく、数値解析に関するいくつかのコースを見つける必要があります。特定の結果を計算する他の方法よりも良い方法がありますが、私は実際にそれらに入ることはできません(私は勉強をしたことはありません。

1

はい、アルゴリズムの情報が少なくなります。分数の数学的な値に最も近いdoubleの値を見つけたいと仮定すると、total << 53を保持できる整数型が必要です。独自に作成することも、GMPのようなライブラリを使用することもできます。その後

  • 規模partial2*r < total場合は、半分を切り上げしたい場合numerator = (partial << m)
  • qが整数商numerator/totalr = numerator % total
  • なりましょう(total << 52) <= numerator < (total << 53)は、mantissa = q+12*r == total2*r > total場合と場合= q+1mantissa = qを聞かせてよう、= q半分に丸めたい場合は2つの半分を均等にしたい場合は
  • result = scalbn(mantissa, -m)

1最下位ビットの違いは、おそらくあまりにも稀ではありませんあなたは(double)partial/(double)totalと同じ値を取得する時間のほとんどは、2つまたは3つのLSBの違いは、どちらか私を驚かせるが、まれではない、Aより大きな違いはありえません(つまり、誰かがすぐに例を挙げるでしょう)。

今、努力する価値はありますか?通常はありません。