4

多くの浮動小数点計算を行うアプリケーションに取り組んでいます。Intel x86 では、倍精度浮動小数点値を持つ VC++ を使用します。私たちの計算は10 進数n桁まで正確であると主張しています (現在は 7 桁ですが、15 桁を主張しようとしています)。

結果がわずかに変化した場合 (コードのリファクタリング、クリーンアップなどにより)、他のソースに対して結果を検証するために多くの努力を払います。FPU 制御状態、コンパイラ/オプティマイザ、浮動小数点モデル、演算自体 (つまり、アルゴリズム自体) の全体的な順序など、多くの要因が全体的な精度に影響することはわかっていますが、固有の不確実性を考えると、 FP 計算 (たとえば、0.1 を表すことはできません) では、すべての計算について特定の精度を主張することは無効に思えます。

私の質問はこれです: 任意の種類の分析 (間隔分析など) を行わずに、一般的に FP 計算の精度について何らかの主張をすることは有効ですか? もしそうなら、どのような主張が可能で、その理由は何ですか?

編集:

入力データがたとえば小数点以下n桁まで正確であるとすると、倍精度が使用されていることを考えると、任意の計算の結果について何らかの保証を行うことができますか? たとえば、入力データの有効桁数が 8 桁の場合、出力の有効桁数は少なくとも 5 桁になります... ?

私たちは数学ライブラリを使用しており、それらが行う保証または行わない保証については認識していません。私たちが使用するアルゴリズムは、必ずしも正確に分析されているわけではありません。ただし、特定のアルゴリズムが与えられたとしても、実装は結果に影響します (たとえば、2 つの加算演算の順序を変更するだけです)。たとえば、倍精度を使用する場合、固有の保証はありますか?

別の編集:

私たちは、他の情報源に対して結果を経験的に検証します。では、たとえば 10 桁の精度を達成できたとき、私たちは幸運に恵まれているのでしょうか?

4

7 に答える 7

7

そのようなすべての質問と同様に、私は記事「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」で簡単に答える必要があります。あなたが話しているタイプの仕事には絶対に不可欠です。

于 2010-02-15T02:17:37.510 に答える
6

簡単な答え:いいえ。

理由:作業を進めても精度が低下していないことを証明しましたか (はい証明されました)? 本気ですか?超越関数に使用しているライブラリ関数の固有精度を理解していますか? 加法誤差の限界を計算しましたか? 反復アルゴリズムを使用している場合、終了時にどれだけうまく収束したか知っていますか? このようなものは難しいです。

于 2010-02-15T02:18:01.033 に答える
5

コードで IEEE 754 で指定された基本演算 (+、-、​​、/ および平方根) のみを使用しない限り、制御外のライブラリ関数 (三角関数、exp/log、 ...) 導入。基本 5 以外の関数は、1ULP で正確であることが保証されておらず、通常は正確ではありません。

経験的なチェックを行うことはできますが、それはそのままです...経験的なものです。ソフトウェアの EULA に保証がないことを忘れないでください。

ソフトウェアが安全性を重視し、ライブラリに実装された数学関数を呼び出さない場合は、http://www-list.cea.fr/labos/gb/LSL/fluctuat/index.htmlを検討できます。しかし、重要なソフトウェアのみが努力する価値があり、このツールの分析制約に適合する可能性があります。

編集後、コンパイラが自分の背後で何かをしていることを主に心配しているようです。それは当然の恐怖です(数学関数のように、あなたはコントロールできないからです)。しかし、それが問題になる可能性はほとんどありません。コンパイラは、要求したよりも高い精度で計算する場合があります (64 ビット double を要求した場合は 80 ビット拡張、32 ビット float を要求した場合は 64 ビット double)。これは、C99 標準で許可されています。最近傍への丸めでは、これにより二重丸めエラーが発生する可能性があります。しかし、失うのはわずか 1ULP であり、ほとんどの場合、心配する必要はありません。これにより、次のような不可解な動作が発生する可能性があります。

float x=1.0;
float y=7.0;
float z=x/y;
if (z == x/y) 
...
else
... /* the else branch is taken */

==しかし、浮動小数点数の間で使用するときに問題を探していました。

Kahan の合計アルゴリズムのように、意図的にキャンセルを行うコードがある場合:

d = (a+b)-a-b;

コンパイラがそれを に最適化するとd=0;、問題が発生します。はい、この最適化「あたかもフロート操作が連想的であるかのように」は、一般的なコンパイラで見られます。C99 では許可されていません。でも、状況は良くなったと思います。コンパイラの作成者は、浮動小数点の危険性をより認識し、それほど積極的に最適化しようとしなくなりました。さらに、コードでこれを行っていれば、この質問をすることはありません。

于 2010-02-15T02:20:01.943 に答える
2

マシン、コンパイラ、ランタイム ライブラリ、およびオペレーティング システムのベンダーが浮動小数点の精度についてそのような主張をしていないことを考えると、あなたのグループは、以下に該当する可能性のある主張を行うことに慎重であるべきだという警告と見なす必要があります。クライアントがあなたを法廷に連れて行った場合の厳しい精査。

システム全体の正式な検証を行わない限り、そのような主張は避けます。私は人間の安全に間接的な影響を与える科学的ソフトウェアに取り組んでいるので、過去にそのようなことを検討してきましたが、そのような主張はしていません。

double (長さ) 浮動小数点計算の精度について無用な主張をすることはできますが、基本的には価値がありません。

参照:プログラミング言語とシステムに関する ACM トランザクションからの浮動小数点計算の検証の落とし穴 30、3 (2008) 12

于 2010-02-15T02:35:19.160 に答える
1

いいえ、そのような請求はできません。そのようにしたい場合は、次のことを行う必要があります。

  • 数値計算の専門家を雇って、アルゴリズムを分析します。
  • ライブラリとコンパイラのベンダーに、分析のためにソースをその専門家に公開してもらうか、ハードセマンティクスとエラー境界について承認してもらいます。

倍精度浮動小数点は、通常、10 進数で約 15 桁の精度を持ちますが、その精度の一部またはすべてが失われる方法があまりにも多く、専門家でない人が診断したり主張したりするにはあまりにも微妙です。あなたが主張したいことのように。

特定の計算について正確性を主張できるエラー範囲を実行し続ける比較的簡単な方法がありますが、ソフトウェアで実行されるすべての計算の正確性について主張することは、はるかに困難です。

于 2010-02-15T04:54:14.940 に答える
0

Intel CPU の倍精度数は、有効桁数 (10 進数) が 15 桁よりわずかに優れています。

単純な計算の潜在的なエラーは、n/1.0e15 の範囲内にあります。ここで、n は、使用している数値の大きさのオーダーです。Intel には、CPU ベースの FP 計算の精度に関する仕様があるのではないかと思います。

ライブラリ関数 (cos や log など) の潜在的なエラーは通常、文書化されています。そうでない場合は、ソース コード (GNU ソースなど) を見て計算できます。

手動計算の場合と同様に、計算のエラー バーを計算します。

これを行うと、計算を適切に順序付けすることでエラーを減らすことができる場合があります。

于 2010-02-15T04:36:18.867 に答える
0

任意の計算の精度について懸念しているように見えるので、試すことができるアプローチを次に示します。浮動小数点計算のさまざまな丸めモードでコードを実行します。結果が互いにかなり近い場合は、おそらく問題ありません。結果が近くない場合は、心配する必要があります。

結果の最大差によって、計算精度の下限が決まります。

于 2010-02-15T05:41:26.503 に答える