我想在C ++中使用几个科学常量来做一些计算,比如
我的计算方法如sqrt((2kT)/ m)
对这些常量和结果使用double是否安全?
答案 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。我不是浮点专家。我碰巧知道一些。