无法使 C++ 程序使用足够高的精度
Can't make C++ program use high enough precision
...
cout << setprecision(100) << pow((3+sqrt(5.0)),28) << endl;
...
产出
135565048129406451712
不够精确但是
$ bc <<< "scale = 100; (3+sqrt(5.0))^28"
产出
135565048129406369791.9994684648068789538123313610677119237534230237579838585720347675878761558402979025019238688523799354
这就是我想要的。我正在设置 cout
精度,所以它一定是 sqrt
、pow
或 +
正在失去精度?
在 cout
上设置精度对 C++ 中的底层计算方式没有任何影响。 float
s 通常有大约 8 位精度,doubles
大约有 16 位;您的 C++ 输出只有前 15 位数字与 bc 输出匹配。
如果你想要更高的精度,那么你将不得不使用其他方法,例如任意精度数值库。这就是 bc
程序实现任意精度数学的方式。
例如,使用:
#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
#include <iomanip>
int main() {
mpf_set_default_prec(402);
mpf_class a = 3_mpf + sqrt(5_mpf);
mpf_class output;
mpf_pow_ui(output.get_mpf_t(), a.get_mpf_t(), 28);
std::cout << std::setprecision(121);
std::cout << output << '\n';
}
这会打印:
135565048129406369791.9994684648068789538123313610677119237534230237579838585720347675878761558402979528909982661363879709
有趣的是,这与 bc <<< "scale = 100; (3+sqrt(5.0))^28"
的输出不同,但如果您将 bc 的比例设置得更高,您会看到 gmp 的输出是正确的。
看起来 bc 愿意打印出它拥有的许多数字,即使生成这些数字的表达式的操作数没有足够的精度来使它们正确。相比之下,GMP 似乎是根据给定输入精度的准确度来设置结果的精度。
...
cout << setprecision(100) << pow((3+sqrt(5.0)),28) << endl;
...
产出
135565048129406451712
不够精确但是
$ bc <<< "scale = 100; (3+sqrt(5.0))^28"
产出
135565048129406369791.9994684648068789538123313610677119237534230237579838585720347675878761558402979025019238688523799354
这就是我想要的。我正在设置 cout
精度,所以它一定是 sqrt
、pow
或 +
正在失去精度?
在 cout
上设置精度对 C++ 中的底层计算方式没有任何影响。 float
s 通常有大约 8 位精度,doubles
大约有 16 位;您的 C++ 输出只有前 15 位数字与 bc 输出匹配。
如果你想要更高的精度,那么你将不得不使用其他方法,例如任意精度数值库。这就是 bc
程序实现任意精度数学的方式。
例如,使用:
#include <gmp.h>
#include <gmpxx.h>
#include <iostream>
#include <iomanip>
int main() {
mpf_set_default_prec(402);
mpf_class a = 3_mpf + sqrt(5_mpf);
mpf_class output;
mpf_pow_ui(output.get_mpf_t(), a.get_mpf_t(), 28);
std::cout << std::setprecision(121);
std::cout << output << '\n';
}
这会打印:
135565048129406369791.9994684648068789538123313610677119237534230237579838585720347675878761558402979528909982661363879709
有趣的是,这与 bc <<< "scale = 100; (3+sqrt(5.0))^28"
的输出不同,但如果您将 bc 的比例设置得更高,您会看到 gmp 的输出是正确的。
看起来 bc 愿意打印出它拥有的许多数字,即使生成这些数字的表达式的操作数没有足够的精度来使它们正确。相比之下,GMP 似乎是根据给定输入精度的准确度来设置结果的精度。