检查浮点数是否为负的奇怪方法

时间:2017-09-13 06:00:47

标签: c++ c function floating-point printf

在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的人也欢迎提供帮助。

1 个答案:

答案 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看起来很奇怪。