2012-03-30 10 views
2

浮動小数点数を使用する場合、数値は複数の表現を持つことができるため、浮動小数点の除算の結果はビットごとに異なる浮動小数点数を生成する可能性があります。しかし、分母が2の威力であればどうでしょうか?浮動小数点の除算のビット表現 - 浮動小数点の除算の仕方

AFAIKは、2の累乗で除算すると指数をシフトし、同じ仮数を残して、常にビットごとに同じ浮動小数点を生成します。そうですか?浮動用IEEE黒魔術での知識の私の不足のため申し訳ありません

float a = xxx; 
float result = n/1024f; // always the same result? 

--- UPDATE ----------------------

ポイント::)しかし、私はGuvanteが言及した数字について話しています:特定の10進数の表現、 '不正確な'浮動小数点。この記事の残りの部分では、Guvanteのこれらの言葉の定義を考慮して、「正確」と「不正確」を使用します。

簡略化するために、分子は常に「正確な」数であるとしましょう。また、2の累乗ではなく、常に1024で割ってみましょう。さらに、毎回同じ方法で同じ操作をしていますので、異なる実行で同じ結果を得ることについて話しています(同じ入力、確かに)。

私は同じ入力から異なる数字が来るのを見るので、これを頼んでいるので、私は考えています:分子として「正確な」浮動小数点数を使って1024で割ると、指数だけシフトします'正確な'フロート。

例をお願いしました。実際の問題はこれです。私は時々同じ入力に対して0.02999994、場合によっては0.03000000を生成するシミュレータを持っています。私はこれらの数値を1024で乗算して、それらの2つの数値が同じである「整数」(正確な「浮動小数点数」)を得、次に1024で除算して「正確な」丸め浮動小数点数を得ることができると考えました。

私は十進数に変換して浮動小数点に変換できると言われましたが、この方法が有効かどうかを知りたいと思います。

+0

興味深い質問!私も知りたいのですが。 – Msonic

+0

いいえ、あなたの値が基数10から基数2に変換された後、可能な表現は1つだけです。 2の累乗で除算すると指数のみが調整されます。結果を基数10に戻して表示すると、あまりに多く表示すると異なるノイズ桁が生成されます。フロートの有効数字は6.5桁なので、必ずゴミを取り除いてください。 –

+1

"本当の問題はこれです..." - これはあなたの質問になるはずです。おそらく、入力と実行された操作に関するいくつかの特質が必要です。理想的には、同じ入力に対して異なる出力を生成するサンプルコードの合理的な短いビットです。 –

答えて

5

数は、我々がフロート

を使用した場合の質問が間違った前提に基づいて予測しているように見える複数の表現を持つことができます。浮動小数点として複数の表現を持つ唯一の数はゼロであり、「正のゼロ」または「負のゼロ」として表すことができます。ゼロ以外の与えられた数値は、 "double"または "float"タイプについて話していると仮定して、floatとして1つの表現しか持たない。

おそらく私は誤解しています。 を参照している問題は、コンパイラが32ビットまたは64ビットよりも高い精度で浮動小数点演算を実行できることです。?それによって、場合によっては除算や乗算によって異なる結果が生じることがあります。

+0

彼は、 '0.1''''''''''''が' 1.0'とは異なる表現を持つことがあることを指摘していると思います。 – Guvante

+2

ゼロとNaNのみが複数の表現を持ちます。デノーマルは、本質的に、「段階的アンダーフロー」を可能にするために使用される浮動小数点の固定小数点サブセットです。彼らはすべてユニークです。 –

+0

@JeffreySax:もちろん正しいです。私は彼らが*定点*であることを忘れていました。私はそれを修正するでしょう。 –

4

人々はしばしば浮動小数点数を完全に把握していないので、私はあなたのポイントのいくつかを本当に素早く行きます。浮動小数点数の各ビットの組み合わせはそれぞれ固有の数を表します。しかし、その数には基数2の小数成分があるため、特定の10進数の表現はありません。たとえば、1.1です。そのような場合は、最も近い数字を取ることになります。 IEEE 754-2008は、これらのケースでも、最も近いものから最も近いものへのラウンドを指定します。

本当に難しいのは、これらの「不正確な」数字の2つを組み合わせた場合です。これは、各中間ステップが丸めを伴うため、問題を引き起こす可能性があります。2つの異なる方法を使って同じ値を計算すると、微妙に異なる値が出てくる可能性があります。通常は、これはイプシロンで処理されます。

実際の質問には、2の累乗で除算し、追加の「不正確さ」を導入しないでください。通常、すべての浮動小数点数と同様に、デノルルやその他の奇妙なケースには独自のロジックがありますが、仮に仮数がオーバーフローすると難しくなります。また、数学的なエラーは何も導入されていないことに注意してください。単純な計算では結果が断続的に丸められます。

EDIT:あなたは仕事ができると言ってますが、丸めほとんど同じですされているどのような新しい質問

に対応して。さらに、同等性を探しているだけの場合は、前に(a - b) < eで述べたように、小さな値のe(例では0.0001)を使用する必要があります。あなたがかなりの数をプリントアウトしようとしていて、使用しているフレームワークがあなたの好みに合っていない場合は、ソリューションを記述する最も直接的な方法があります。

+0

ありがとうございます、私はより多くの情報で私の質問を編集しました。 – Roberto