【发布时间】:2015-12-02 19:19:32
【问题描述】:
例如,考虑以下双精度数:
x = 1232.2454545e-89;
y = -1232.2454545e-89;
我能确定y 总是完全 等于-x(或Matlab 的uminus(x))吗?或者我应该期待小的数值差异或eps,因为它经常发生在数值计算中?例如sqrt(3)^2-3:结果不完全为零。一元减号也会发生这种情况吗?像平方根一样有损吗?
提出问题的另一种方式是:负数字文字是否总是等于否定其正对应物?
我的问题是关于 Matlab,但可能与 IEEE 754 标准有关,而不是与 Matlab 相关。
我用一些随机选择的数字在 Matlab 中做了一些测试。我发现,在这些情况下,
- 他们确实是平等的。
-
typecast(x, 'uint8')和typecast(-x, 'uint8')仅在 IEEE 754 double-precision format 定义的符号位上有所不同。
这表明答案可能是肯定的。如果应用一元减号仅更改符号位,而不更改有效位,则不会丢失精度。
当然,我只测试了几个案例。我想确保在所有情况下都会发生这种情况。
【问题讨论】:
-
这似乎取决于rounding mode。您是否对特定的整数或任意浮点值感兴趣。
-
@horchler 任意浮点值。是的,我想答案是肯定的需要向零舍入。 Matlab 使用的舍入模式是否已知?
-
不知道。 IEEE-754 的默认舍入模式为 "symmetric"。我猜它会使用它,尽管它也可能依赖于系统。
-
对于任何想玩的人,您可以使用
reshape(flipud(dec2bin(typecast(x, 'uint8'),8))',1,64)查看底层二进制表示。在我的机器上先签名,然后是 11 位指数,然后是 52 位尾数。 -
@aka.nice 我唯一看到舍入可能是一个因素是从具有高于 53 位精度的文字中分配双精度值时。否则我同意,因为每个可表示的值都有一个唯一的表示,并且每个表示都有一个唯一的负数,所以一旦你有一个表示的值,否定就不会涉及舍入。
标签: matlab language-agnostic ieee-754 numerical