如何在序列计算之和中实现最大精度?

问题描述 投票:-2回答:2

我写了一个代码来计算系列的总和2 ^( - k),但我不知道如何提高这个计算的准确性。这就是我到目前为止所做的。

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

int main()
{
    int i, n;
    float sum = 0;

    cout << "Enter the value of n: ";
    cin >> n;

    for (i=1; i<=n; i++)
        sum += 1.0/pow(2,i);

    cout << "Sum: " << sum;


    return 0;
}

任何建议和/或帮助非常感谢。

c++ series floating-accuracy
2个回答
0
投票

要查看更精确的输出,您需要请求比C ++默认值更高的精度。一种方法是:

#include <iomanip>
…
   std::cout << std::setprecision(99);

接下来,考虑以下代码:

for (i=1; i<=n; i++)
    sum += 1.0/pow(2,i);

首先,要认识到pow实施的质量各不相同。 C和C ++标准对浮点运算的质量不严格,并且一些pow实现返回的结果与pow(10, 3)等与数学结果略有不同的简单情况相同。由于经常实施pow的方式,pow(2, i)可能不会遇到这个问题,但应该考虑。

让我们假设pow(2, i)准确地计算出正确的结果。我们还假设您的C ++实现使用float的通用IEEE-754基本32位二进制浮点格式。如果是这样,n≤24的上面计算的总和没有误差。

这是因为每个项1.0/pow(2, i)可以表示为float的有效数(分数部分)中的单个位,并且float具有24位有效数,因此可以表示24个连续位而没有错误。一旦增加用于格式化输出的精度,n≤24所示的总和就应该是精确的。

n = 25时,总和不再适合float。此时,数学结果将四舍五入到float中可表示的最接近的值,通常使用如下规则:如果两个最接近的可表示值之间存在平局,则将选择具有偶数低位的值。这意味着结果将是1,确切地说。对于所有n> 24,结果将是1。

使用float类型时,不可能将精度提高到超出此范围。这是因为,在float类型中可以表示的所有值中,1是最接近系列的精确数学和的值。根本没有更接近的可表示值,因此源代码的计算或更改不能产生更准确的值。

您可以使用double而不是float生成更准确的值。如果用于double的IEEE-754基本64位二进制格式,那么这将产生n≤53的精确结果。对于n> 53,结果将再次为1,并且只有通过使用扩展 - 才能改善总和精确算术。

另外,请注意:

float sum = 0;
for (i=1; i<=n; i++)
    sum += 1.0/pow(2,i);

在数学上等同于:

float sum = 1 - pow(2.f, (float) -n);

-1
投票

嗯,我认为pow首先使用base,而像这样的exponent也记得-i:

for (i=1; i<=n; i++)
    sum += pow(2,-i);

在声明sum时可以使用double而不是float,以使其更准确(double使用比float更多的位来表示十进制数,因此它具有更高的精度)

© www.soinside.com 2019 - 2024. All rights reserved.