1

私は、ソフトウェアによって実行されるいくつかの演算を記述する仕様を書いています。この仕様を 2 人の異なるプログラマ (異なる言語やアーキテクチャを使用している可能性がある) に渡すことができ、彼らのプログラムに何らかの入力を与えると、両者は常に同じ結果を吐き出すことが意図されています。

たとえば、仕様に「結果に 0.5 を追加する」と記載されている場合、これは問題になる可能性があります。浮動小数点の格納方法に応じて、0.5 は 0.4999999135、または 0.500000138 などとして表すことができます。

全体的に一貫性を持たせるために、ここでルールを指定する最善の方法は何ですか? 「すべての数値はIEEE 754 64 ビット形式で表す必要があります」とだけ言ってもいいですか? それとも、「すべての数値は最初に 1000 でスケーリングし、固定小数点演算を使用して計算する必要があります」のようなことを言ったほうがよいでしょうか?

問題は全体的な精度ではなく、プラットフォーム間の再現性であるため、これは私が遭遇したほとんどの浮動小数点の質問とは少し異なります。

4

1 に答える 1

4

IEEE 754-2008 条項 11 は、再現可能な浮動小数点の結果に何が必要かを説明しています。これは主に次のとおりです。

  • プログラミング言語から IEEE 754 操作へのバインド (たとえば、a*bIEEE 754 で指定された浮動小数点乗算を実行します)。
  • 再現可能な結果が望まれることを指定する方法。たとえば、オブジェクトの公称タイプよりも広い精度を使用するには、デフォルトの言語権限を無効にします。
  • 外部の 10 進文字シーケンスとの間の正確な変換。
  • IEEE 754 のより洗練された機能の一部を回避します。

これらの要件は、今日のコンパイラでは十分にサポートされていません。

.5 を追加しても問題ありません。すべての通常の浮動小数点の実装は、.5 を正確に表し、正しく加算します。問題になるのは、ある言語実装が .5 を追加して結果を正確に (通常よりも正確にdouble) 保持する一方で、別の実装が結果を に丸める可能性があることdoubleです。数学ライブラリ ルーチン ( や など) が使用されている場合coslogこれは別の問題です。これは、うまく計算するのが難しく、実装が異なれば近似値が異なるためです。

IEEE 754 は適切な仕様です。理想的には、仕様の実装が IEEE 754 に準拠していることを指定します。

于 2013-06-10T19:46:56.313 に答える