0

double (8 バイト、64 ビット) のデータ型に対して e-8 の許容範囲 +- を取得することに興味があります。

例: 0.123456782456789

小数点以下 8 桁以内のプラス/マイナスの許容範囲を取得したいと思います。


低範囲 = 0.123456781456789

高範囲 = 0.123456783456789

小数点第 9 位の違いに注目してください。

入力が 16 進数で指定された double の場合。16 進数に何を加算または減算する必要がありますか? これは double であるため、4 つのデータ ワードが含まれます。3 番目のデータ ワードから 256 (10 進数) を加算/減算する必要がありますか?

例えば:

3FBF 9ADD 1B1F 0D35 は、0.123456782456789 の 16 進数です。

では...低域と高域は次のようになります。

3FBF 9ADD 1* A *1F 0D35

3FBF 9ADD 1* C *1F 0D35

4

1 に答える 1

1

x の |x|•10 -8以内にある点を含む区間 [a, b] を計算するには、 a と b を設定します。

double t = fabs(x) * 1e-8;
double a = x-t;
double b = x+t;

丸め誤差により a または b がわずかに不正確になる可能性があるため、これは概算です。間隔にすべてのポイントを絶対に含める場合は、 よりもわずかに高い値を1e-8使用するか、より高度な手法を使用できます。

いくつかの警告:

テストの一部として間隔を使用して、計算された値が別の値と「ほぼ等しい」かどうかを判断する場合、間隔の大きさを決定するには、使用される浮動小数点演算と関連する値を分析する必要があります。状況によっては、浮動小数点値がゼロから無限大の範囲のエラーを生成する可能性があります。すべての状況で、または「典型的な」状況でさえも有効な許容範囲を 1 つだけ示すことはできません。

間隔の大きさを決定するには、アプリケーションで許容できるエラーを決定する必要があります計算エラーを許容するために等しくない値を受け入れることは、プログラムが真に等しくない値を等しいものとして受け入れる場合があることを意味します (正確に計算された場合、エラーはありません)。したがって、プログラムが許容できない結果を生成する前に、間隔がどれくらい大きくなるかを把握する必要があります。

明らかに、間隔がそれよりも大きくなければならない場合、プログラムは壊れています。この間隔の使用は機能しません。このような場合、浮動小数点演算を再設計してエラーを少なくするか、プログラムを再設計してこれを回避する必要があります。

一般に、浮動小数点数の表現を使用してその値を読み取ったり変更したりすることはお勧めできません。これを行うには、コンパイラまたはプラットフォームの仕様の詳細に注意を払う必要があります。(特に、テストで動作するように見えるコードは、コンパイラによってサポートされていないという意味で実際には壊れている可能性があり、別のバージョンのコンパイラを使用したり、コンパイル スイッチ (デバッグ用のスイッチやさらに、浮動小数点数の表現にアクセスするためのコードは一般に移植性がありません。(最も顕著なのは、double のバイトを「リトル エンディアン」順で格納するプラットフォームもあれば、「ビッグ エンディアン」順でバイトを格納するプラットフォームもあります。他にも移植性の問題があります。)浮動小数点数、

許容誤差が 10 -8 程度の場合は、 を使用1e-8して間隔を計算するだけで十分です。つまり、通常の浮動小数点演算を使用でき、浮動小数点数の ULP を計算したり、その表現にアクセスしたりする必要はありません。ただし、IEEE-754 浮動小数点数の ULP を計算したい場合は、この回答のコードを使用してその表現にアクセスせずに計算できます。そのコードはfloatではなくのために書かれてdoubleいますが、に変更FLTDBLて、使用する定数を変更できます。floatもちろんにも変更double

于 2012-11-17T13:45:21.103 に答える