Matlab 中的负零
Negative zeros in Matlab
基本上我想问两件事:
- 为什么会这样? (在 Matlab 中为负零)
- 这是什么时候发生的?
我想出了 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 文档:"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的值其实都是负数
在特定的样本案例中,-0.0000
结果实际上是很小的 non-zero 负数。然而,为了使打印输出易于阅读,Matlab 和 Octave 试图避免在打印中使用科学记数法。因此,当与大数字混合时,小数字会减少为 0.0000
或 -0.000
。这可以通过在 Matlab 或 Octave 中设置默认首选项来更改。
但这不是所提问题的唯一答案:
- 为什么会这样? (Matlab 中为负零),
- 这是什么时候发生的?
事实上,在 Matlab 和 Octave 以及任何使用浮点运算的计算环境中,-0.
真的很重要。这不是计算环境中的错误,而是 allowance in the IEEE-754 浮点数二进制表示的标准,它是 CPU 中浮点处理器的产物(不是编程语言).
虽然整数的二进制表示没有特殊的符号位,但 IEEE-754 为符号保留了一个位,与数字分开。因此,虽然数字部分可能表示 0
,但符号位保留表示负数。
只要您的 CPU(Intel 或 AMD)生产带有 0.
和任何负数(包括 -0.
)的产品,它就会发生。我不知道 IEEE-754 是否要求这样做,或者这只是 CPU 设计优化(最大化速度,最小化尺寸)的结果。
无论哪种情况,这个 -0.
都是 non-issue,因为 IEEE-754 要求它在比较和算术上与 0.
完全相同。即:
-0. < 0 --> FALSE
-0. == 0 --> TRUE
1+ -0. == 1 --> TRUE
etc...
基本上我想问两件事:
- 为什么会这样? (在 Matlab 中为负零)
- 这是什么时候发生的?
我想出了 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 文档:"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的值其实都是负数
在特定的样本案例中,-0.0000
结果实际上是很小的 non-zero 负数。然而,为了使打印输出易于阅读,Matlab 和 Octave 试图避免在打印中使用科学记数法。因此,当与大数字混合时,小数字会减少为 0.0000
或 -0.000
。这可以通过在 Matlab 或 Octave 中设置默认首选项来更改。
但这不是所提问题的唯一答案:
- 为什么会这样? (Matlab 中为负零),
- 这是什么时候发生的?
事实上,在 Matlab 和 Octave 以及任何使用浮点运算的计算环境中,-0.
真的很重要。这不是计算环境中的错误,而是 allowance in the IEEE-754 浮点数二进制表示的标准,它是 CPU 中浮点处理器的产物(不是编程语言).
虽然整数的二进制表示没有特殊的符号位,但 IEEE-754 为符号保留了一个位,与数字分开。因此,虽然数字部分可能表示 0
,但符号位保留表示负数。
只要您的 CPU(Intel 或 AMD)生产带有 0.
和任何负数(包括 -0.
)的产品,它就会发生。我不知道 IEEE-754 是否要求这样做,或者这只是 CPU 设计优化(最大化速度,最小化尺寸)的结果。
无论哪种情况,这个 -0.
都是 non-issue,因为 IEEE-754 要求它在比较和算术上与 0.
完全相同。即:
-0. < 0 --> FALSE
-0. == 0 --> TRUE
1+ -0. == 1 --> TRUE
etc...