在C ++中使用double作为科学常量是否安全?

时间:2017-11-29 05:37:02

标签: c++ floating-accuracy

我想在C ++中使用几个科学常量来做一些计算,比如

  1. 有效电子质量(m)9.109e-31kg
  2. 电子电荷1.602e-19 C
  3. 玻尔兹曼常数(k)1.38×10-23
  4. 时间8.92e-13
  5. 我的计算方法如sqrt((2kT)/ m)

    对这些常量和结果使用double是否安全?

1 个答案:

答案 0 :(得分:7)

浮点算术和准确性是一个非常棘手的主题。绝对阅读floating-point-gui.de网站。

许多浮点运算的错误可能会累积到无意义的结果。由此发生了几起灾难性事件(生命损失,数十亿美元的崩溃)。未来会发生更多。

有一些静态source analyzers致力于检测它们,例如Fluctuat(由我的CEA同事,现在法国Palaiseau的Ecole Polytechnique的几个)和其他人。但Rice's theorem适用,因此静态分析问题一般无法解决。

(但浮点精度的静态分析有时几乎可以在几千行的某些程序上工作,并且不能很好地扩展到大型程序)功能

还有一些程序用于计算,例如法国巴黎LIP6的CADNA

(但是仪表可能会给出错误的过高估计)

您可以将数值算法设计为对浮点错误不太敏感。这非常困难(你需要years的工作来获得相关的技能和专业知识。)

(你需要数学,数学和计算机科学技能,博士水平)

您还可以使用arbitrary-precision arithmetic或扩展精度(例如128位浮点数或quad-precision)。这会减慢计算速度。

一个重要的考虑因素是您可以分配多少精力(时间和金钱)来捕获浮点错误,以及它们对您的特定问题有多重要。但是有No Silver Bullet,浮点数的问题仍然是一个非常困难的问题(你可以在你的整个生活中工作)。

PS。我不是浮点专家。我碰巧知道一些。