为什么浮点数打印为负零?

Why does a float print out as negative zero?

问题

有时零值的浮点数被打印为负零,即使不等式检查显示该数字是非负数。

申请

我正在尝试以人类可读的格式注销 UIView 的转换矩阵。数字应该这样排列:

- (void) describe
{
    NSLog(
        @"|%@%.2f %@%.2f 0.00|\n|%@%.2f %@%.2f 0.00|\n|%@%.2f %@%.2f 1.00|",
        self.transform.a < 0 ? @"" : @" ",
        self.transform.a,
        self.transform.b < 0 ? @"" : @" ",
        self.transform.b,
        self.transform.c < 0 ? @"" : @" ",
        self.transform.c,
        self.transform.d < 0 ? @"" : @" ",
        self.transform.d,
        self.transform.tx < 0 ? @"" : @" ",
        self.transform.tx,
        self.transform.ty < 0 ? @"" : @" ",
        self.transform.ty
    );
}

我在非负数前放置空格以匹配负数的宽度。在某些情况下,数字排成一行:

| 0.00 -1.00 0.00|
| 1.00  0.00 0.00|
| 0.00  0.00 1.00|

对视图应用几次旋转后,数字不再对齐:

| -0.00 -1.00 0.00|
| 1.00  -0.00 0.00|
| 0.00  0.00 1.00|

在上述情况下,selfNSLog 将转换打印为:

transform = [-0, -1, 1, -0, 0, 0];

问题是零值被注销为负零,但被检测为非负值。如果我能理解这个神话般的负零是如何存在的,那么我就可以解决我的格式问题。

[从评论中移出答案]

浮点值有尾数、指数和符号分开

  • 因此它们能够存储相同的 +0 和 -0 ...
  • 符号是上次操作的剩余值...