gpt4 book ai didi

c++ - GNU MP Bignum 库的数值问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:31 26 4
gpt4 key购买 nike

我正在做一些数字运算,这需要高精度算术。我正在使用 GNU MP 库,并且 according to the GMP manual :

“ float 或简称 Float,是具有有限精度指数的任意精度尾数。”

尽管尾数应该具有任意精度,但我仍然遇到精度问题。为了避免让您厌烦我的实际代码,这里有一个近乎最小的工作示例来说明我的问题。该代码计算出 9.3^15、9.8^15 和 (9.3*9.8)^15。在我的机器上,(9.3^15)*(9.8^15) 和 (9.3*9.8)^15 的值从第 16 位开始开始不同,在这种情况下导致错误(大约)4.94* 10^13。

任何帮助将不胜感激。代码如下。

#include <gmp.h>
#include <gmpxx.h>

#include <iostream>
#include <iomanip>

int main()
{
mpf_class x, y, z;
x = y = z = 1.0;

for (int i = 0; i < 15; i++)
{
x *= 9.3;
y *= 9.8;
z *= 9.3*9.8;
}

std::cout << z - x*y << std::endl;

return 0;
}

最佳答案

您看到的问题是由于 9.3 * 9.8 的计算近似值。请将文字更改为 mpf_class 的实例:

mpf_class a, b;
a = 9.3;
b = 9.8;

// ...

x *= a;
y *= b;
z *= a * b;

如果您需要无限精度,请考虑改用有理数:

#include <gmp.h>
#include <gmpxx.h>

#include <iostream>
#include <iomanip>

int main()
{
mpq_class x(1), y(1), z(1), a(93, 10), b(98, 10);

for (int i = 0; i < 15; i++)
{
x *= a;
y *= b;
z *= (a * b);
}

std::cout << z - x*y << std::endl << z << std::endl;

return 0;
}

打印

0
7589015305950762920038660273144124106674963183136666693/30517578125000000000000000

关于c++ - GNU MP Bignum 库的数值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com