奇怪的是,为什么我的abs函数返回-0?

rag*_*ius 5 c objective-c

以下abs函数有时会返回-0 (减零)

inline float abs(float a){
    return( a>=0.0f? a :-a);
}
Run Code Online (Sandbox Code Playgroud)

更具体地说,该语句 sprintf(str, "%.2f", abs(-0.00f) );产生"-0.00",这很烦人,因为字符串显示给用户.

题:

1)为什么会产生-0

2)如何解决?

PS:我正在使用xcode(目标)c编译器.

R..*_*R.. 12

  1. 因为-0.0 == 0.0-0.0 >= 0.0是真的.

  2. 使用fabs(或fabsf代替浮动double而不是尝试重新发明它).

  • @ragnarius:这不是一个真正的编译器问题,但它是IEEE 754标准的一部分.大多数实现至少名义上符合IEEE 754标准,而那些通常不支持`-0.0`的实现. (3认同)
  • 对我来说,-0.0 == 0.0并不明显.-0.0和0.0的二进制表示是不同的,我猜想两个浮点数是相等的,当且仅当它们的二进制表示相等时(但是我猜错了,至少对于某些编译器而言) (2认同)

Ale*_*ylo 2

  1. -0 是二进制表示的产物,0 带有符号位集。如果您想了解更多详细信息,维基百科有一篇关于签名零的综合文章。

  2. 正如上面人们所说,使用 fabs() 。如果你真的真的想要内联,请链接你的比较:

    内联浮点abs(float a) { return (a > 0.f) ? a : ( (a < 0.f) ? -a : 0); }