无法使 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 精度,所以它一定是 sqrtpow+ 正在失去精度?

cout 上设置精度对 C++ 中的底层计算方式没有任何影响。 floats 通常有大约 8 位精度,doubles 大约有 16 位;您的 C++ 输出只有前 15 位数字与 bc 输出匹配。

如果你想要更高的精度,那么你将不得不使用其他方法,例如任意精度数值库。这就是 bc 程序实现任意精度数学的方式。

例如,使用:

https://gmplib.org

#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 似乎是根据给定输入精度的准确度来设置结果的精度。