数字小于机器精度的安全算术?

Safe arithmetic with numbers smaller than machine precision?

本文关键字:安全 小于 机器 精度 数字      更新时间:2023-10-16

这似乎是一个非常基本的问题,但我仍然不确定我是否正确理解。

假设我定义了一些非常小和很大的数字

constexpr double a = 1.53636e-34;
constexpr double b = 6.12362e-36;
constexpr double c = 6.92956e+19;

并想将它们用于一些算术。在只有 16 位数字有效的情况下,以双精度执行此操作是否安全?

编辑:让我们举个例子。假设我们想获得原子单位的光速。它被定义为:

double c = 2 * epsi * h * col / (e * e);

哪里

double e = 1.602176634e−19;
double h = 6.62607015e−34;
double col = 299792458;
double epsi = 8.8541878128e−12;

我们显然不关心小数点后第九位左右发生的一切。不过,我们关心的是,上述结果始终为 137.035999....

编辑2:公式错误。

对于大小介于10-308和 10308之间的值,使用 64 位(通常在 C++ 中double(的 IEEE-754 浮点数的相对精度是恒定的*。

在此范围内,当您以规范化科学记数法书写数字时,小数点后会有大约 15-16 个十进制有效数字。

*嗯,保持在很小的范围内:
https://en.wikipedia.org/wiki/IEEE_754-1985#/media/File:IEEE_754_relative_precision.svg

您正在使用的函数(例如,sqrt()tan()(负责所需的精度范围: 因此,根据数值分析中教授的内容,您必须确定此类函数调用中发生的预期错误。通常,您只能确保略低于函数调用时串联操作可以假定的最低精度保证。

注:标签 [数值分析]

它的安全性取决于您如何定义"安全",请记住,C++中的浮点数学只是一个近似值。你提到你想做物理和相关计算,因为一切都是物理学的近似值,我认为它不会出错。事实上,double是适合您情况的最佳工具。它具有存储效率,快速且相当精确。问题是数字有多大或多小与精度无关。