web-dev-qa-db-ja.com

C ++はdoubleまたはlongdoubleよりも正確に計算します

私は自分自身にC++を教えています この練習用の質問 PIを30桁以上に計算できるコードを書くように求められます。私のコンピューターでは、double/longdoubleはどちらも16桁の精度であることがわかりました。

この質問の教訓は、利用可能なものを超えた精度を計算できるようにすることだと思います。したがって、どうすればこれを行うことができますか?出来ますか?

円周率を計算するための私のコードは

#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;

int main(){ 

    double pi;
    pi = 4*atan(1.0);
    cout<<setprecision(30)<<pi;
    return 0;
}

比較のため、出力は16桁、円周率は30桁です。

3.1415926535897931
3.141592653589793238462643383279

精度を上げるための提案はありますか、それともこれは問題ではありませんか?あるいは、私がここで学ぶべきだと思う別のレッスンがある場合は、遠慮なくそれを提供してください。ありがとうございました!

12
Terence Chow

浮動小数点以外の方法を使用して計算を実行する必要があります。 [〜#〜] gmp [〜#〜] のような「長い数学」を行うためのライブラリがあります。

それがあなたが探しているものではない場合は、これを自分で行うためのコードを書くこともできます。最も簡単な方法は、文字列を使用し、文字ごとに数字を格納することです。紙の上で手でやった場合と同じように数学をやってください。数字を足し合わせるのは比較的簡単なので、引くことも簡単です。乗算と除算を行うのは少し難しいです。

整数以外の数値の場合、加算/減算の小数点を必ず揃える必要があります...

それを書くことは良い学習経験ですが、それがあまり考えずに30分でノックアップするものになるとは思わないでください[おそらく足し算と引き算!]

10
Mats Petersson

quad math 、組み込みタイプ__float128およびq/QサフィックスをGCC/clangで使用できます。

#include <stdio.h>

#include <quadmath.h>

int main ()
{
  __float128 x = strtoflt128("1234567891234567891234567891234566", nullptr);
  auto y = 1.0q;
  printf("%.Qf", x + y); // there is quadmath_snprintf, but this also works fine
  return 0;
}
1