我正在学习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在我的应用程序中获得正确的浮点精度吗?或任何其他库?
我应该使用GMPMPIR 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
从头到尾的精度,并且应该在数学上正确到该精度级别。