【问题标题】:Negative zeros in MatlabMatlab中的负零
【发布时间】:2016-08-25 16:33:23
【问题描述】:

基本上我想问两件事:

  1. 为什么会发生这种情况? (Matlab 中的负零)
  2. 什么时候会发生这种情况?

我想出了this。 Octave 与 Matlab 有一些相似之处,因此这个功能的用处是显而易见的,但他们所说的其中一件事是,它不会出现在默认输出中。我现在就解决了。那么,也许对此有新的见解?

对于第二个问题,在我提到的已回答问题中,他们只是说它可能发生在某些计算中,而在我刚刚进行的以下计算中,似乎没有必要使用(或获取)它负零。

我遇到的代码是:

xcorr([1 0 1 1], [0 1 1 0 0])

它的输出在哪里:

-0.0000   -0.0000    1.0000    1.0000    1.0000    2.0000    1.0000    0.0000    0.0000

xcorr 实际上是一个交叉相关函数,它只执行一些简单的操作,如求和和乘法,具体函数细节可以在here 找到。无论如何,没有什么像“复平面的复杂分支切割和变换”

谢谢

【问题讨论】:

    标签: matlab double precision negative-number cross-correlation


    【解决方案1】:

    这些值不代表零。相反,它们是非常接近于零的负值。 获得这些值而不是简单地为零的原因是由于在函数实现中执行的近似值。根据 Matlab 文档:"xcorr estimates the cross-correlation sequence of a random process".

    换句话说 - 屏幕上显示的值只是负值的近似值。

    为了测试这一点,你可以改变Matlab的显示格式。

    代码:

    format shortE;
    xcorr([1 0 1 1], [0 1 1 0 0])
    

    结果:

    ans =
    
      Columns 1 through 5
    
     -6.2450e-017 -5.5511e-017  1.0000e+000  1.0000e+000  1.0000e+000
    
      Columns 6 through 9
    
      2.0000e+000  1.0000e+000  1.1102e-016  1.1796e-016
    

    如您所见,坐标 1、2、8 和 9 中的值实际上是负数。

    【讨论】:

    • 感谢您的回答。就像你说的,不是零,而是一个很小的数字。但是,为什么会发生这种情况?正如 Matlab 文档(当然还有这个函数的公式),只是乘法之和。
    • 根据公式你是正确的。但是,MATLAB 对 xcorr 的实现只是这个公式的近似值。正如 Matlab 官方文档中所写:“xcorr estimates the cross correlation sequence”。因此,最终输出并非 100% 准确。
    • 我在 Matlab R2020a、win64 上没有从 xcorr([1 0 1 1], [0 1 1 0 0]) 得到任何负数
    【解决方案2】:

    在特定的示例情况下,-0.0000 实际上是微小的非零负数。然而,为了使打印输出具有人类可读性,Matlab 和 Octave 试图避免在打印中使用科学记数法。因此,当与大数字混合时,小数字会减少到0.0000 或-0.000。这可以通过在 Matlab 或 Octave 中设置默认首选项来更改。

    但这不是问题的唯一答案:

    1. 为什么会发生这种情况? (Matlab 中的负零),
    2. 什么时候会发生这种情况?

    事实上,在 Matlab 和 Octave 以及任何使用浮点数的计算环境中,-0. 真的很重要。这不是计算环境的bug,而是IEEE-754浮点数二进制表示标准中的allowance,它是CPU中浮点处理器的产物(不是编程语言) .

    虽然整数的二进制表示没有特殊的符号位,但 IEEE-754 为符号保留了一个位,与数字分开。因此,虽然数字部分可能表示 0,但符号位表示负数。

    只要您的 CPU(英特尔或 AMD)使用 0. 和任何负数(包括 -0.),就会发生这种情况。我不知道这是 IEEE-754 要求的,还是仅仅是 CPU 设计优化的结果(最大化速度,最小化尺寸)。

    在任何一种情况下,这个 -0. 都不是问题,因为 IEEE-754 要求它在相对和算术上与 0. 完全相同。那就是:

    -0. < 0      --> FALSE
    -0. == 0     --> TRUE
    1+ -0. == 1  --> TRUE
    etc...
    

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2011-03-09
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多