提问者:小点点

如何在Qt和C中获得正确的浮点精度?


我正在学习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吗?

谢谢你!


共1个答案

匿名用户

当您使用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从头到尾的精度,并且应该在数学上正确到该精度级别。