C ++での浮動小数点演算の問題に対する解決策はありますか?
-
27-09-2019 - |
質問
私はいくつかの浮動小数点演算を行うと精度の問題を抱えています。得られた値は、同じ入力用の2台のマシン上で異なっています。私は記事を読ん@ できないのはなぜ私の乗算フロート?ともウェブ上の他の材料を読んで&浮動小数点のバイナリ表現で、マシンイプシロン上で行うようになっていることがわかります。しかし、私はC ++での浮動小数点演算のために、この問題/いくつかの仕事の周りを解決する方法があるかどうかを確認したかったです?私は、ストレージのための符号なしshortにフロートを変換していますし、必要なときに背中を変換しています。私は戻って符号なしshortに変換するときただし、(6つの小数点ポイントへの)精度は、一台のマシン上の正しいままですが、他に失敗しました。
//convert FLOAT to short
unsigned short sConst = 0xFFFF;
unsigned short shortValue = (unsigned short)(floatValue * sConst);
//Convert SHORT to FLOAT
float floatValue = ((float)shortValue / sConst);
解決
A short
少なくとも16ビット、およびそれが正確に何を実装の全体の多くでなければなりません。 unsigned
16ビットshort
は短いが6精度の完全な5桁を保持し、そして確かにないことを意味し、0から65535までの値を保持します。あなたは6桁の数字が必要な場合は、20ビットを必要とします。
そのため、精度の損失は、あなたが5桁未満のものに精度の6桁をパックしようとしているという事実に可能性によるものです。おそらくfloat
同じくらいのストレージとして取る整数型を使用するよりも、他の本への解決策は、ありません。
それは1つの所与のシステム上で動作するように思われる理由を私は知りません。あなたは、両方で同じ番号を使用していましたか?一つは偶然あなたがしようとしたサンプルに期待していた結果が得られた古い浮動小数点システム、および1つを使用しましたか?それはおそらく他のより大きなshort
を使用していた?
他のヒント
あなたはネイティブ浮動小数点型を使用したい場合は、あなたができる最善のは、あなたのプログラムでの出力値が基準値のセットからあまり異なっていないことを主張することである。
「あまり」の正確な定義は、アプリケーションに完全に依存します。あなたは、異なるプラットフォーム上でa + b
を計算する場合たとえば、あなたは二つの結果が互いのマシンの精度内であることを見つける必要があります。あなたが何かをやっている一方、多くの行列反転のような複雑な、結果が最も可能性の高い機械精度以上によって異なります。あなたは結果がお互いになることを期待することができ、正確にどれだけ近いかを決定することは非常に微妙かつ複雑なプロセスです。あなたは、あなたがやっている正確に何を知っている限り、それはあなたがあなたのアプリケーションにおける下流必要な精度の量を決定し、その結果が十分に正確であることを確認するために、おそらくより安全(と正気)です。
は、その中にリンクされます:
C#する 浮動小数点比較関数>あなたはこのような標準を探しています:
種類のテクニカルレポートを - のための拡張に2の代わりに変換するためにそれを0xFFFFで使用半分、すなわち32768を用います。 (フロートに戻す変換しつつ)短い(またはまで)OxFFFFが1111111111111111. Ox8000のバイナリ表現のバイナリ表現が明らかに変換中に、乗算&divsion操作を意味しているのに対し、32768(Ox8000)が1000000000000000のバイナリ表現を有する精密値を変更しませんゼロの後。それはより正確な結果をもたらすように片側の変換のために、しかしOxFFFFが好ましいです。