以下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编译器。
答案 0 :(得分:12)
因为-0.0 == 0.0
因此-0.0 >= 0.0
为真。
使用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.0f
和0.0f
数字相等,因此返回a
-0.0f
。
关于浮点类型的进一步说明:
-0等于0.这是唯一浮点异常,其中2个不同的二进制IEEE 754位表示相等。一些其他浮点格式具有表示相同数值的各种不同的位表示。
NAN不等于NAN。 NAN可以用多种表示来表示,但即使2个NAN具有完全相同的位表示,它们不数字(==)比较相等。
答案 2 :(得分:2)
-0是二进制表示的工件,0表示符号位。如果您想了解更多详情,维基百科有a comprehensive article on signed zero。
如上所述,使用fabs()。如果你真的真的想内联,请将你的比较链接起来:
内联浮动abs(浮动a) { 返回(a> 0.f)? a :((a <0.f)? - a:0); }