C++计算比双精度或长双精度更精确

C++ calculating more precise than double or long double

本文关键字:双精度 计算 C++      更新时间:2023-10-16

我正在自学C++在这个练习题上,它要求编写可以将PI计算为>30位的代码。我了解到双/长双精度在我的计算机上都是精确的 16 位数字。

我认为这个问题的教训是能够计算超出可用精度的精度。因此,我该怎么做呢?可能吗?

我现在计算 Pi 的代码是

#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 位,pi 为 30 位以进行比较。

3.1415926535897931
3.141592653589793238462643383279

提高精度的任何建议,还是这永远无关紧要?或者,如果您认为我应该在这里学习另一节课,请随时提供。谢谢!

您需要使用浮点以外的其他方法执行计算。有用于进行"长数学"的库,例如GMP。

如果这不是您要查找的内容,您也可以自己编写代码来执行此操作。最简单的方法是只使用一个字符串,并为每个字符存储一个数字。做数学,就像你在纸上用手做一样。将数字相加相对容易,减法也相对容易。做乘法和除法有点困难。

对于非整数,您需要确保将小数点对齐以进行加/减...

写这是一个很好的学习经验,但不要指望它是你在半小时内不假思索地敲出的东西[也许加减!

您可以在 GCC/clang 中使用四元数学、内置类型 __float128q/Q 后缀。

#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;
}