-1

この二重乗算 (double)1000000007 * (double)11111111 の出力は 7 で終わる必要があります (正確には 11111111077777777 に等しい)。しかし、私が書いたこのコードは、6 (正確には 11111111077777776 に等しい) で終わる結果を出力します。何が間違っているのかわかりません。どんな助けでも素晴らしいでしょう。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << setprecision(40) << (double)1000000007 * (double)11111111;
}
4

3 に答える 3

7

値で乗算を行うとdouble、結果は正確ではありません。には固有の精度がありdouble、かなり正確ですが、値を正確に表すには十分ではありません。

What Every Computer Scientist Should Know About Floating-Point Arithmeticを読むことをお勧めします。

于 2013-01-10T19:35:35.770 に答える
2

浮動小数点演算は正確ではありませんが、非常に正確です。ここでそれについて読むことをお勧めします: http://en.wikipedia.org/wiki/Floating_point

基本的に、その数値を正確に表すのに十分なビットがないため、精度エラーが発生します。

于 2013-01-10T19:35:23.807 に答える
1

あなたは何も悪いことをしていません。これは double の実装に関係しています。double の実装が提供する以上の精度が必要な場合は、「大きな数」の操作に使用できるライブラリが必ずあります。

于 2013-01-10T19:35:54.157 に答える