0

私はいくつかの浮動小数点演算を行っており、精度の問題があります。結果の値は、同じ入力の2台のマシンで異なります。投稿を読んだ@フロートを掛けられないのはなぜですか?また、Web上の他の資料を読んで、浮動小数点のバイナリ表現とマシンイプシロンに関係していることを理解しました。ただし、この問題を解決する方法があるかどうかを確認したかった/C++での浮動小数点演算の回避策?? ストレージ用にfloatをunsignedshortに変換し、必要に応じて元に戻しています。ただし、unsigned 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);
4

4 に答える 4

2

Ashortは少なくとも16ビットである必要があり、多くの実装ではそれがまさにそれです。unsigned16ビットは0から65535までのshort値を保持します。つまり、shortは完全な5桁の精度を保持せず、確かに6桁を保持しません。6桁が必要な場合は、20ビットが必要です。

したがって、6桁の精度を5桁未満にパックしようとしているため、精度が低下する可能性があります。おそらくと同じくらい多くのストレージを必要とする整数型を使用する以外に、これに対する解決策はありませんfloat

ある特定のシステムでなぜそれが機能するように見えるのかわかりません。両方で同じ番号を使用していましたか?古い浮動小数点システムを使用したものと、試したサンプルで期待した結果が偶然に得られたものを使用しましたか?おそらくshort他のものよりも大きいものを使用していましたか?

于 2010-10-28T17:02:09.730 に答える
1

ネイティブの浮動小数点型を使用する場合は、プログラムによって出力される値が一連の参照値とあまり変わらないことを表明するのが最善の方法です。

「多すぎる」の正確な定義は、アプリケーションによって異なります。たとえば、a + b異なるプラットフォームで計算する場合、2つの結果が互いにマシン精度の範囲内にあることがわかります。一方、マトリックス反転のようなより複雑なことをしている場合、結果はマシンの精度以上に異なる可能性があります。結果が互いにどれだけ近いかを正確に判断することは、非常に微妙で複雑なプロセスです。自分が何をしているのかを正確に理解していない限り、アプリケーションのダウンストリームで必要な精度の量を判断し、結果が十分に正確であることを確認する方がおそらく安全です(そして賢明です)。

2つの浮動小数点値間の相対誤差を確実に計算する方法については、この回答とそれにリンクされている浮動小数点ガイドを参照してください。

C#の浮動小数点比較関数

于 2010-10-28T15:07:50.430 に答える
0

0xFFFFを使用する代わりに、その半分、つまり変換に32768を使用します。32768(Ox8000)のバイナリ表現は1000000000000000ですが、OxFFFFのバイナリ表現は1111111111111111です。Ox8000のバイナリ表現は、変換中(ショート(または)フロートに変換中)の乗算および除算操作が精度値を変更しないことを明確に示しています。ゼロの後。ただし、片側変換の場合は、より正確な結果が得られるため、OxFFFFの方が適しています。

于 2011-12-17T09:49:07.877 に答える