0

我正在编写描述具有关键行为的系统的物理模拟,这意味着它在此状态下的特性对外部参数有非常强烈的依赖性​​(例如,水在 100°C 以下是液体,而气体则在上面)。我对我目前的结果不满意,我现在对我的变量的精度有些怀疑。到目前为止,我一直在使用双打,但我不确定我可以从他们那里得到的精度,例如:

long double K = 0.274653072;
cout << K << endl;

float K = 0.274653072;
cout << K << endl;

给我相同的输出(0.274653),是因为 cout 运算符在一定位数后切割的参数,还是在存储 3 之后我真的丢失了所有内容?如果我想获得最高 10^{-8} 或 10^{-9} 的精度的最佳效率,我应该使用哪个变量?(如果这很重要,我在计算中使用指数)

4

4 回答 4

2

使用哪个变量并不重要。不同之处在于您输出该变量的时间。使用printf以获得更好的精度。例如:printf("%.3f\n", K)%f用于浮点数和%lf双精度数。%.3f从上面的例子中,输出是浮点数,精度高达 3 位。

于 2013-10-29T10:10:48.397 回答
0

我读过的关于浮点精度的最好的文章是这篇文章。它的风格恰好吸引了我。然而,浮点变量的规范来源是“每个计算机科学家应该知道的关于浮点运算的知识”,在此处复制。

于 2013-10-29T10:27:39.000 回答
0

您可以使用std::setprecisionfrom iomanipheader 来调整输出的精度std::cout

#include <iomanip>
#include <iostream>
#include <limits>
[...]

long double K = 0.274653072;
std::cout << std::setprecision(std::numeric_limits<long double>::digits10)
          << K << std::endl;

请注意,通常浮点输出是一个难题,因此即使在最大精度下,输出也可能不是您所期望的。获得精确输出的唯一方法是以std::hexfloat16 为基数而不是 10 基数使用和输出。这消除了任何舍入错误,但当然会给非程序员带来更难解释的输出。

于 2013-10-29T10:29:00.427 回答
0

您确定您选择了正确的工具吗?像 C++ 这样的语言中的科学计算是一门不平凡的艺术。如果您的计算非常敏感,也许您应该考虑使用 Matlab、R 或类似工具等专用工具。或者至少使用专门的 C/C++ 库。以“幼稚”的方式在一系列计算中编写数学公式可能会导致显着的累积误差。关于这个主题有整本书。

于 2013-10-29T10:26:08.767 回答