变量包含额外的隐藏元数据 - 也就是当零不为零(但仍然是)

Stu*_*unt 10 floating-point matlab zero complex-numbers

我讨厌不得不问这个,因为我认为答案必须简单,但我不能因为我的生活似乎追查来源.在尝试重写函数时,遇到了这个问题:

a = -j
x = real(a)  
y = imag(a)
y/x
Run Code Online (Sandbox Code Playgroud)

Inf我出乎意料地吐了出来.然而...

a = 0
b = -1
b/a
Run Code Online (Sandbox Code Playgroud)

-Inf像我期望的那样回归.进一步询问a == x,b == y.显然,这不是真的.经过很多挫折后,我终于找到了问题.如果原始输入a0-j(相对-j)则没有问题.

双方real(-j)real(0-j)返回零和测试为零,但显然似乎保存涉及原籍,我绝对不能发现一些元数据.我到底错过了什么?如果我必须用类似的东西来解决这个问题,那将会感到完全错误if (x == 0) then x = 0;

cha*_*pjc 10

不是元数据,只是双精度浮点数的符号位.

>> a = 0-j;
>> b = -j;
>> ra = real(a)
ra =
     0
>> rb = real(b)
rb =
     0
>> ra==0
ans =
     1
>> isequal(ra,rb)
ans =
     1
Run Code Online (Sandbox Code Playgroud)

到目前为止看起来一样.然而,不同的是,b我们设置了两个实部和虚部的符号位,当我们做-j = -complex(0,1)0-j = complex(0,-1)(见创建复数).深入研究typecast,不会转换基础数据:

>> dec2bin(typecast(ra,'uint64'),64)
ans =
0000000000000000000000000000000000000000000000000000000000000000
>> dec2bin(typecast(rb,'uint64'),64)
ans =
1000000000000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

该1是IEEE 754双精度浮点表示中的第63位(0):

在此输入图像描述

瞧!-0也存在于MATLAB中!

  • 另一种说法是`-j`计算为` - (0 + j)= -0-j`而'0-j`是'+ 0-j`.将"-0"与"+ 0"进行比较预期会产生相等性,但是当你通过零分割达到无限域时,这个符号实际上确实有所不同. (2认同)