为什么浮点数打印为负零?
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|
在上述情况下,self
的 NSLog
将转换打印为:
transform = [-0, -1, 1, -0, 0, 0];
问题是零值被注销为负零,但被检测为非负值。如果我能理解这个神话般的负零是如何存在的,那么我就可以解决我的格式问题。
[从评论中移出答案]
浮点值有尾数、指数和符号分开
- 因此它们能够存储相同的 +0 和 -0 ...
- 符号是上次操作的剩余值...
问题
有时零值的浮点数被打印为负零,即使不等式检查显示该数字是非负数。
申请
我正在尝试以人类可读的格式注销 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|
在上述情况下,self
的 NSLog
将转换打印为:
transform = [-0, -1, 1, -0, 0, 0];
问题是零值被注销为负零,但被检测为非负值。如果我能理解这个神话般的负零是如何存在的,那么我就可以解决我的格式问题。
[从评论中移出答案]
浮点值有尾数、指数和符号分开
- 因此它们能够存储相同的 +0 和 -0 ...
- 符号是上次操作的剩余值...