在C ++项目中,我看到了这个:
#include <cstdlib>
#include <cstdio>
static int isNegative(float arg)
{
char p[20]; // Assume 20 is enough
sprintf(p, "%f", arg);
return p[0] == '-';
}
int main()
{
printf("%d\n", isNegative(-1));
}
我听说sprintf()
可能有问题,因为写入p
时可能会导致负号消失。真的吗?或者这种方法是防弹(但是非常糟糕的做法)?
PS:忽略-0
的角落情况。专注于sprintf()
。我知道存在更好的解决方案,但我只是对此感到好奇。来自C的人也欢迎提供帮助。
答案 0 :(得分:2)
您可以使用%+f
确保输出符号(+
或-
)(但无论如何都会输出-
)。所以我认为保证正常的浮动值。
我唯一关心的是特殊价值:inf和nan。所以我已经在输出中添加了打印p
并进行了实验。这是我用gcc 6.3得到的:
printf("IsNegative: %d\n", isNegative(+1.0/+0.0));
printf("IsNegative: %d\n", isNegative(-1.0/+0.0));
printf("IsNegative: %d\n", isNegative(+0.0/+0.0));
printf("IsNegative: %d\n", isNegative(+0.0/-0.0));
printf("IsNegative: %d\n", isNegative(-0.0/+0.0));
printf("IsNegative: %d\n", isNegative(-0.0/-0.0));
结果:
p = +inf
IsNegative: 0
p = -inf
IsNegative: 1
p = -nan
IsNegative: 1
p = -nan
IsNegative: 1
p = -nan
IsNegative: 1
p = -nan
IsNegative: 1
除了方法应该有效之外,结果对于nan看起来很奇怪。