5

いくつかの計算を実行したいのですが、結果を小数点以下の桁数、たとえば 12 まで正しくしたいので、サンプルを書きました。

#define PI 3.1415926535897932384626433832795028841971693993751
double d, k, h;
k = 999999/(2*PI);
h = 999999;
d = PI*k*k*h;
printf("%.12f\n", d);

しかし、それは出力を与えます:

79577232813771760.000000000000

私も setprecision() を使用しましたが、指数形式ではなく同じ答えです。

cout<<setprecision(12)<<d<<endl;

版画

7.95772328138e+16

ロングダブルも使用しましたが無駄でした。

整数部分と小数部分を別々に long long int 型に格納する以外に方法はありますか?

もしそうなら、正確な答えを得るために何ができるでしょうか?

4

5 に答える 5

4

倍精度の概念をもう一度読む必要があります。より慎重に

double64 ビットを使用することで精度が向上しました。
小数点の前のものは、その後のものよりも重要です。
そのため、大きな整数部分がある場合、精度の低い部分が切り捨てられます。これは、ここのさまざまな回答で として説明されていますrounding off


更新:
精度を上げるには、ライブラリを使用するか、言語を変更する必要があります。
この他の質問を確認してください:大きい数 (50000 桁以上) を処理するための最適なコーディング言語

もう一度、あなたの意図を再確認していただきたいと思います。


  • 本当に高い値を持つ数値(例のように整数部分で 10 桁を超える) に小数点以下 12 桁が本当に必要ですか?
  • おそらく、大きな整数部分は実際にはありません
    (その場合、そのようなコードは正常に動作するはずです)。
  • しかし、 のような値を追跡している場合10000000000.123456789
    私はあなたが作業しているアプリケーション (天文学?) に正確に興味があります。
  • 値の整数部分が を下回っている場合は、10000ここで問題ありません。

Update2 :
特定の式が制約されたエラー制限内で正確に機能することを実証する必要がある場合は、エラーが最小限になるように式の処理を修正する必要があります。

例、

  • 言いたい場合は、(x * y) / z
  • 次のようなことを試すのが賢明でしょうmax(x,y)/z * min(x,y)
  • の後にオーバーフローする可能性がある元の形式では(x * y)なく、 の小数点以下 16 桁に収まらない場合は精度が失われます。double

精度が 2 桁しかない場合は、

.               2-digit       regular-precision
 `42 * 7        290           297
 (42 * 7)/2     290/2         294/2
 Result ==>     145           147

       But ==>  42/2 = 21
                21 * 7 = 147

これはおそらくあなたのコンテストの意図です。

于 2013-04-10T16:43:14.977 に答える
0

を探していstd::fixedます。これは、指数形式を使用しないよう に ostreamに指示します。

cout << setprecision(12) << std::fixed << d << endl;
于 2013-04-10T16:37:27.240 に答える