【问题标题】:C++ calculating more precise than double or long doubleC++ 计算比 double 或 long double 更精确
【发布时间】:2013-02-01 00:18:59
【问题描述】:

我正在自学 C++,在 this practice question 上它要求编写可以将 PI 计算到 >30 位的代码。我了解到 double / long double 在我的计算机上都是 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

有什么提高精度的建议吗?或者这件事永远不会重要?或者,如果您认为我应该在这里学习其他课程,请随时提供。谢谢!

【问题讨论】:

标签: c++ precision


【解决方案1】:

您将需要使用浮点以外的其他方法执行计算。有一些库可以做“长数学”,例如GMP

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

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

写下它是一次很好的学习经历,但不要指望它是你在半小时内没有经过深思熟虑就敲出来的东西[也许是加减法!]

【讨论】:

  • 嗯,有道理。我将检查 GMP,但在字符串中存储数字有点巧妙。感谢您的回答!
  • 我曾经在 1980 年代在一台名为 ABC-80 的计算机上使用“字符串数学”进行 Basic 计算 - 我很确定我们同时计算了 pie或其他。但是,我认为它仅限于 26 位或类似的数字。
  • 这也是我的解释——没有“作弊”。
【解决方案2】:

您可以在 GCC/clang 中使用 quad math、内置类型 __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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-17
    • 2023-02-22
    • 2018-11-30
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多