在C+中使用double表示科学常数是否安全+;? 我想用C++等一些科学常数做计算,例如 电子的有效质量(m)9.109e-31 kg 电子电荷1.602e-19 C 玻尔兹曼常数(k)1.38×10−二十三 时间8.92e-13

在C+中使用double表示科学常数是否安全+;? 我想用C++等一些科学常数做计算,例如 电子的有效质量(m)9.109e-31 kg 电子电荷1.602e-19 C 玻尔兹曼常数(k)1.38×10−二十三 时间8.92e-13,c++,floating-accuracy,C++,Floating Accuracy,我有这样的计算,sqrt((2kT)/m) 对这些常数和结果使用double安全吗?浮点运算和精度是一个非常棘手的问题。请阅读本网站 许多浮点运算的错误可能累积到给出无意义结果的程度。因此发生了几起灾难性事件(生命损失、数十亿美元的坠机事件)。将来还会发生更多的事情 有一些静电传感器专门用于检测它们,例如(由我的CEA同事,几个现在在法国帕莱索的Ecole Polytechnique)和其他一些。但是,这种方法的应用使得静态分析问题在一般情况下是无法解决的 (但是浮点精度的静态分析有时实际上可以

我有这样的计算,sqrt((2kT)/m)


对这些常数和结果使用double安全吗?

浮点运算和精度是一个非常棘手的问题。请阅读本网站

许多浮点运算的错误可能累积到给出无意义结果的程度。因此发生了几起灾难性事件(生命损失、数十亿美元的坠机事件)。将来还会发生更多的事情

有一些静电传感器专门用于检测它们,例如(由我的CEA同事,几个现在在法国帕莱索的Ecole Polytechnique)和其他一些。但是,这种方法的应用使得静态分析问题在一般情况下是无法解决的

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

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

(但仪器可能会给出误差的极大近似值)

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

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

您还可以使用或扩展精度1(例如128位浮点或)。这会减慢计算速度

一个重要的考虑因素是您可以分配多少精力(时间和金钱)来查找浮点错误,以及它们对您的特定问题有多大影响。但是确实存在,而且浮点精度的问题仍然是一个非常困难的问题(你可以为此付出一生的努力)


另外,我不是浮点运算专家。我只是碰巧知道一些。

用你给出的具体例子(常数计算):

您没有在问题中定义“安全”。我假设您希望保持相同数量的正确有效数字

  • 双精度为15位有效数字
  • 您的常数有4个有效数字
  • 这些运算包括乘法、除法和平方根运算
  • 您的结果似乎不会进入双精度的“边缘”情况(对于非常小或非常大的指数值,尾数会失去精度)
在这个特定的顺序中,结果将正确到4位有效数字


但是,在一般情况下,您必须小心。(可能不会,这当然取决于您对“安全”的定义)

这是一个庞大而复杂的课题。特别是,如果您有以下情况,您的结果可能不正确到相同的有效位数:

  • 更多的行动
  • 如果你有相互接近的数字的减法
  • 其他有问题的操作
必读:

有关其他参考资料,请参见的正确答案


此外,对于复杂的计算,对问题有一些概念也是相关的。

如果您需要是或否的答案,

取决于计算中可接受的误差范围。在这种情况下,“安全”是什么意思?您关心什么?您正在进行哪种计算。例如,如果你做的是两个非常接近的数字的差,那么double(和float)更容易出错。你应该读一读关于一个问题的原因有一篇著名的文章:double的正确数字是整数值中15个有效的十进制数。讨论分数是什么意思,考虑1/128。它是0.0078125到小数点后六位,但在浮点数中,它只是一个有效的小数位。反之亦然。