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

时间:2013-07-12 17:10:44

标签: objective-c c

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

inline float abs(float a){
    return( a>=0.0f? a :-a);
}

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

问题:

1)为什么会产生-0

2)如何解决?

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

3 个答案:

答案 0 :(得分:12)

  1. 因为-0.0 == 0.0因此-0.0 >= 0.0为真。

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

答案 1 :(得分:2)

使用signbit()进行区分。使用-0和-INF,我认为,-NAN(如果有这样的话)。

// C11
inline float ragnarius_abs(float a) {
  return signbit(a) ? -a : a;
}

至于为什么a = -0.0f; a>=0.0f? a :-a;会产生-0-0.0f >= 0.0f为真:-0.0f0.0f 数字相等,因此返回a -0.0f


关于浮点类型的进一步说明:

-0等于0.这是唯一浮点异常,其中2个不同的二进制IEEE 754位表示相等。一些其他浮点格式具有表示相同数值的各种不同的位表示。

NAN不等于NAN。 NAN可以用多种表示来表示,但即使2个NAN具有完全相同的位表示,它们数字(==)比较相等。

答案 2 :(得分:2)

  1. -0是二进制表示的工件,0表示符号位。如果您想了解更多详情,维基百科有a comprehensive article on signed zero

  2. 如上所述,使用fabs()。如果你真的真的想内联,请将你的比较链接起来:

    内联浮动abs(浮动a) {     返回(a> 0.f)? a :((a <0.f)? - a:0); }