2015-10-18 10 views
6

標準では、すべての実装で関数がまったく同じ結果を返すことが保証されていますか?スタンダードはstd :: pow、std :: logなどのcmath関数について何を言っていますか?

例えば、32ビットIEEE浮動小数点の場合はpow(float,float)となります。同じ2つの浮動小数点数が渡された場合、結果はすべての実装で同じですか?

powの実装に使用されているアルゴリズムによっては、標準で許容されるわずかな差異についていくつかの柔軟性がありますか?

+0

標準では、 'float'と' double'はIEEE-754タイプではありません。さまざまな範囲と精度で、マシン固有のタイプにすることができます。 – lodo

+1

'float'と' double'sに同じ表現を使用し、丸めに関する同じ設定を使用する2台のマシンをお持ちの場合、私はその答えを知らないのです。他のすべてのケースでは、答えはいいえ、異なる結果を与えることができます。 – lodo

+0

も同じマシン上にある2つの異なるコンパイラで、ieee754に従います。もしstdがyesと答えるならば、それは正しい答えが何であるかを定義しなければならないでしょう。 – steviekm3

答えて

18

いいえ、C++標準では、すべての実装でcmath関数の結果が同じである必要はありません。まず、IEEE-754/IEC 60559浮動小数点演算を取得しないことがあります。

実装はIEC 60559を使用しないと__STDC_IEC_559__を定義している場合、それはC標準のF附属書する必見付着が(はい、あなたの質問は、C++についてですが、C++標準では用C標準に延期する、と述べましたCヘッダはmath.hのように)。附属書Fの状態:

  • floatタイプは、IEC 60559、単一の形式と一致します。
  • doubleタイプは、IEC 60559ダブルフォーマットと一致します。
  • タイプは、IEC 60559拡張フォーマットと一致します。さらに

、それは通常の算術IEC 60559標準に従わなければならないと言う:

  • +*、および/演算子はIEC 60559は、加算、減算、乗算提供し、分割操作。

さらに、IEC 60559に従うことsqrtを必要とする:

    <math.h>
  • sqrt機能はIEC 60559平方根演算を提供します。

それは、あなたはおそらく、この質問のために興味を持っていませんほとんどが、他のいくつかの浮動小数点関数の振る舞いを記述するために行きます。

最後に、math.hヘッダを取得し、各種の数学関数(すなわちsincosatan2exp、等)特別な場合を処理する(すなわち、asin(±0)戻り±0atanh(x) NaNを返し、上昇させる方法を指定します| x |> 1などの "無効な"浮動小数点例外)。しかし、通常の入力に対する正確な計算を決して決して決して決してしません。つまり、正確な同じ計算を生成するすべての実装に頼ることはできません。

実装していない場合でも、実装によってすべて__STDC_IEC_559__が定義されていても、これらの関数はすべての実装で同じように動作する必要はありません。


これはすべて理論的な観点からのものです。実際には、状況はさらに悪化します。 CPUは一般的にIEC 60559算術を実装していますが、丸めのモードが異なるため結果がコンピュータによって異なります。浮動小数点演算。

実際、理論的にはそれほど厳密ではなく、2つのコンピュータがある時点でやや異なる結果を生み出す可能性が非常に高いです。


実際の例は、glibc(GNU Cライブラリの実装)です。 They have a table of known error limits for their math functionsを異なるCPUにまたがって使用します。すべてのC数学関数がビット精度である場合、それらの表はすべて0のエラーULPを示します。しかし、彼らはしません。これらの表は、実際にC数学関数の誤差の量が様々であることを示しています。ある種のこのようなsqrtfma、その結果、完全にIEEE 754浮動小数点演算に対応する基準によって指定されrintとして機能し、文字列と浮動小数点間の変換を除き

:私はこの文章が最も興味深い要約であると思います、GNU Cライブラリは、[...]数学ライブラリ内の関数のために正しく丸め結果を得るためのビットの正確なglibcのであるビット正確であることが要求されているものです

だけの事を目的としていませんC標準の附属書Fによる。あなたがテーブルで見ることができるように、ほとんどのものはそうではありません。

+0

詳細な回答ありがとうございます。したがって、同じ結果を保証するには、独自のpow関数を記述する必要があります。 – steviekm3

+4

かなり。実際、ビット精度が重要である状況(オーディオコーデックやビデオコーデックなど)では、独自の固定小数点演算を実装することは珍しいことではありません。 – Cornstalks

+0

あなたの文章中の「普通の入力」はどういう意味ですか?「普通の入力の正確な計算を決して決して決して決してないのですか? –

関連する問題