【问题标题】:Why does a float print out as negative zero?为什么浮点数打印为负零?
【发布时间】:2015-01-28 22:02:57
【问题描述】:

问题

有时即使不等式检查表明该数字不是负数,零值的浮点数也会被打印为负零。

应用

我正在尝试以人类可读的格式注销 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];

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

【问题讨论】:

  • 负零是非负的;它是零。 en.wikipedia.org/wiki/Signed_zero 但是你为什么不直接使用字段格式而不是这么费劲呢?例如:NSLog( @"|%5.2f %5.2f 0.00|\n|%5.2f %5.2f 0.00|\n|%5.2f %5.2f 1.00| ...
  • @CarlNorum 嘿,你用这个(+1)击败了我几秒钟
  • 浮点值具有尾数、指数和符号分开,因此它们能够存储+0 -0,它们是相同的......符号是上次操作留下的具有这样的值.. .
  • @CarlNorum 我尝试了你的格式化方式,但是小数点前面的“5”只是设置了小数点左侧的最大数字范围。它会填充小数字。
  • @Pwner,它设置整数的字段宽度,而不仅仅是小数点的左边。填充有什么问题?你想让数字排成一行,对吧?

标签: objective-c cocoa-touch math matrix transform


【解决方案1】:

[答案从评论转移]

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

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

【讨论】: