双倍的精度是多少?

时间:2013-10-29 10:06:32

标签: c++ precision

我正在编码描述具有临界行为的系统的物理模拟,这意味着它在该体系中的属性与外部参数非常依赖(水在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 个答案:

答案 0 :(得分:2)

使用哪个变量无关紧要。不同之处在于输出该变量。使用printf可获得更好的精确度。例如:printf("%.3f\n", K)%f用于浮点数,%lf用于加倍。上面示例中的%.3f表示输出为float,精度最高为3位。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

关于浮点精度的最佳文章是this one。它的风格恰好吸引我。然而,关于浮点变量的规范来源是&#34;每个计算机科学家应该知道的关于浮点算术的内容&#34;,它被复制here

答案 3 :(得分:0)

您可以使用iomanip标题中的std::setprecisionstd::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::hexfloat并在基数16而不是基数10中输出。这消除了任何舍入错误,但当然会留下一个更难解释的输出非程序员。