我正在做一些数字运算,这需要高精度算术。我正在使用 GNU MP 库,并根据 GMP 手册:
“浮点数或简称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;
}