0

次の 2 つのコードは、2 つの異なる出力を生成します。

//this one gives incorrect output
cpp_dec_float_50 x=log(2)
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits)<< x << std::endl;

それが与える出力は

0.69314718055994528622676398299518041312694549560547

これは小数点以下 15 位までしか正しくありません。x が 2 倍だったとしても、最初の 15 桁は正しいはずです。結果はオーバーフローのようです。なぜそうすべきなのかわかりません。cpp_dec_float_50 の精度は 50 桁です。

//this one gives correct output
cpp_dec_float_50 x=2
std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits)<< log(x) << std::endl;

それが与える出力は

0.69314718055994530941723212145817656807550013436026

これは wolframaplha によると正しいです。

4

2 に答える 2

3

これは、実際には次の単なる複雑なバージョンです。

float a = 1 / 2;

ここで、1 / 2は整数除算です。これは、パラメーターが整数であるためです。結果が計算されたfloatに格納される にのみ変換されます。a

結果の計算方法に関する C++ の規則は、その結果をどう処理するかに依存しません。したがって、 、、または のいずれlog(2)に格納しても、 の実際の計算は同じです。intfloatcpp_dec_float_50

コードの 2 番目のビットは、次と同等です。

float b = 1;
float c = 2;
float a = b / c;

今、あなたは を呼び出し/ているfloatので、浮動小数点除算が得られます。C++ の規則で、引数とパラメーターの型が考慮されます。それは十分に複雑であり、結果に対して何をするかを考慮に入れようとすると、C++ のすでに過度に複雑なルールが単なる人間には理解できないものになります。

于 2013-04-13T05:43:51.790 に答える