这根本不是 Matlab 特有的。事实上,所有使用 IEEE754 进行浮点表示的程序都可能具有这种特殊性。
在 IEEE-754 格式中,有一个sign bit。在舍入操作期间该位可能保持不变。所以即使结果是纯粹的0
最后,符号位保留。对于这种浮点数格式来说,这是完全正常的行为:
主条目:签名零
在 IEEE 754 标准中,零是有符号的,意味着存在
“正零”(+0) 和“负零”(−0)。多数情况
运行时环境中,正零通常打印为“0”,
负零为“-0”。这两个值在数值上表现相同
比较,但某些操作对于 +0 和 +0 会返回不同的结果
−0。例如,1/(−0) 返回负无穷大,而 1/+0 返回
正无穷大(以便保持恒等式 1/(1/±∞) = ±∞)。
其他在 x=0 处具有不连续性的常见函数可能会处理
+0 和 −0 不同地包括 log(x)、signum(x) 以及任何负数 y 的 y + xi 的主平方根。与任何
近似方案,涉及“负零”的运算可以
有时会造成混乱。例如,在 IEEE 754 中,x = y 并不
始终意味着 1/x = 1/y,因为 0 = −0 但 1/0 ≠ 1/−0。
Source: Wikipedia Floating_point Signed_zero https://en.wikipedia.org/wiki/Floating_point#Signed_zero
现在 Matlab 在零前面显示一个符号,因为您要求以浮点格式显示它(%.2f
),所以Matlab尊重规范并显示符号。
如果你让Matlab选择最好的显示方式,Matlab会很聪明,把零去掉:
>> disp(ar)
0
另外,Matlab 知道该值为0
如果您查询值的符号,将返回正确的值:
>> sign(ar)
ans =
0
Matlab 将返回-1
如果它被认为是负面的并且+1
如果它被认为是积极的。因此,尽管在显示时遵守 IEEE-754 规范,Matlab 不会感到困惑,并且知道该值没有有意义的符号。
总之,不用担心。它不会带来任何程序问题或计算问题。
如果您唯一的烦恼是显示,另一种解决方法可能是简单地将绝对值乘以sign
由 Matlab 检测到(因为它检测到正确的符号)。
您可以创建一个自定义舍入函数,如果确实重要的话,它可以解决这个问题:
mround = @(x,n) abs(round(x,n))*sign(round(x,n)) ;
arm = mround(a,2) ;
fprintf('a: %.2f. a rounded: %.2f. Zero: %.2f\n', a,arm,0);
a: -0.00. a rounded: 0.00. Zero: 0.00
在这里,舍入操作被评估两次,因为我在内联函数中使用了它,但如果将其放入具有多行的函数中,则仅评估舍入一次,然后使用相同的方法纠正符号。