【问题标题】:Does unary minus just change sign?一元减号只是改变符号吗?
【发布时间】: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 中做了一些测试。我发现,在这些情况下,

这表明答案可能是肯定的。如果应用一元减号仅更改符号位,而不更改有效位,则不会丢失精度。

当然,我只测试了几个案例。我想确保在所有情况下都会发生这种情况。

【问题讨论】:

  • 这似乎取决于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


【解决方案1】:

这个问题取决于计算机体系结构。但是,现代架构(包括 x64 和 ARM 内核)上的浮点数符号由单个符号位表示,并且它们具有翻转该位的指令(例如 FCHS)。既然如此,我们可以得出两个结论:

  1. 可以通过单个位翻转/指令来实现符号的更改(以及indeed is by modern compilers 和架构)。这意味着该过程是完全可逆的,并且不会损失数值精度。
  2. 对于 MATLAB 来说,除了做最快、最准确的事情(只是翻转那个位)之外,其他任何事情都是没有意义的。

也就是说,唯一可以确定的方法是在您的 MATLAB 安装中检查 uminus 的汇编代码。我不知道该怎么做。

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 2015-07-02
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多