Question
我多次被告知,如果运算的数字接近于浮点运算,则浮点运算具有最高的精度。1.0
(或者有时0.1
)。有没有道理呢?
澄清
我所说的“算术”是指诸如a + b
, a * b
, a / b
, 但是也sqrt(x)
和其他数学函数。
具体来说,假设所有变量都是IEEE 64 位双精度 https://en.wikipedia.org/wiki/Double-precision_floating-point_format浮点数字。
Example
在物理模拟代码中,通常通过将物理单位映射到浮点值来合并物理单位。在这里我们有很多自由,但一个选择是随从国际单位/公制 https://en.wikipedia.org/wiki/International_System_of_Units, 就像是
# Base units
m = 1.0 # metre
s = 1.0 # second
kg = 1.0 # kilogram
# Derived units
km = 1e+3*m # kilometre
yr = 60*60*24*365.25*s # year
m_sun = 1.98841e+30*kg # mass of the sun
c = 299792458*m/s # speed of light
...
此类代码中任何量纲变量的数值取决于单位制的选择。如果我们得到一个值x == 1.2e-9
and x
应被理解为例如长度,我们知道这意味着x
是1.2纳米。如果我们选择设置m = 1e-9
, x
相反,会得到一个值1.2
,因为我们现在使用的单位系统中纳米是基本长度单位。
根据模拟中研究的物理系统,可以选择不同的“自然”单位系统。如果我们的重点是原子物理学,那么选择太阳的质量作为基本质量单位可能并不理想。那么为什么不呢?这就是我的问题。当然,所有感兴趣的群体都会有很小的数值,但那又怎样呢?浮点运算固有的不精确性是否会因处理极小/极大的数字而被放大?
我知道存在最小和最大浮点数(类似于1e-324
and 1e+308
)。使用单位系统对于手头的任务来说是如此不合时宜,以至于我们的变量值超出了这些限制,这当然是具有破坏性的。不过,将值保持在这些条内,代码中的典型值是否符合顺序真的有什么区别吗?1.0
, 1e±10
, 1e±100
?
关于数学函数的注意事项
事实上,在输入非常大/小的情况下,各种数学函数都明显不精确。举个例子,cos(1e-8) == 1
,即cos()
函数无法区分小于的正数1e-8
。这是not与我的问题相关,作为输入cos()
必须始终是无量纲的纯数,即独立于代码中定义的单位系统。所有其他三角函数也是如此,而且exp()
, log()
和别的。