我正在学习Qt,我发现它真的很神奇,而且有点容易,因为我已经在Microsoft中使用了MFC。
我开发了一个科学的计算器供教育使用。但我面临的是:
我想要像在现实世界中的计算器一样的高精度浮点运算,所以在搜索后我发现了这个函数:
long double ldRes = std::sqrt(3);
QMessageBox m;
m.settext(QString::number(ldRes, 'g', 30));
m.exec();
输出:
1.73205080756887719317660412344
根据卡西欧计算器的说法,相同操作到相同精度的输出应该是:
1.73205080756887729352744634151
所以很明显,结果是不一样的,所以有人能建议我如何在我的应用程序中使用Qt获得正确的浮点精度吗?或者其他图书馆?
我应该使用GMP MPIR MPFR吗?
谢谢!
当您使用std::sqrt
并传递double
(好吧,int
,它最终将转换为double
(时,结果是double
。
将该结果转换为long double
只会获得大量与平方根运算结果无关的低值位!
我不知道你在用什么"其他计算器",但这两种方法之间的差异会导致不同的结果。
std::sqrtl
与long double
一起工作,或者您可以将long double
参数传递给std::sqrt
,后者会选择正确的重载。
// Effectively equivalent:
long double a = std::sqrtl(3);
long double b = std::sqrtl(3);
long double c = std::sqrt(3.0L);
现在,您的计算从头到尾都具有long double
的精度,并且在数学上应该正确到该精度水平。