数字小于机器精度的安全算术?
Safe arithmetic with numbers smaller than machine precision?
这似乎是一个非常基本的问题,但我仍然不确定我是否正确理解。
假设我定义了一些非常小和很大的数字
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
是适合您情况的最佳工具。它具有存储效率,快速且相当精确。问题是数字有多大或多小与精度无关。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 将stl字符串缩小到小于15个字符的容量
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 数字小于机器精度的安全算术?