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

Weird method to check if a float number is negative

本文关键字:浮点数 是否 检查 方法      更新时间:2023-10-16

在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("%dn", isNegative(-1));
}

我听说sprintf()可能是有问题的,因为这可能会导致写入p时消失的负号。真的吗?还是该方法证明子弹(但很糟糕的做法)?


ps:忽略-0的角案例。专注于sprintf()。我知道存在更好的解决方案,但是我只是为此感到好奇。来自C的人也受到欢迎。

您可以使用%+f来确保输出符号(+-)(尽管无论如何都会输出-)。因此,我认为它可以保证适用于正常的浮点值。

我唯一关心的是特殊价值:inf和nan。因此,我在输出中添加了打印p并进行了实验。这是我使用GCC 6.3的东西:

printf("IsNegative: %dn", isNegative(+1.0/+0.0));
printf("IsNegative: %dn", isNegative(-1.0/+0.0));
printf("IsNegative: %dn", isNegative(+0.0/+0.0));
printf("IsNegative: %dn", isNegative(+0.0/-0.0));
printf("IsNegative: %dn", isNegative(-0.0/+0.0));
printf("IsNegative: %dn", 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来说只有很奇怪,除了该方法应该起作用。

应用指定负值的基本数学规则小于0,正大于0。

#include <cstdio>
static int isNegative(float arg)
{
    return ((static_cast<int>(arg+1) > 0) ? 0 :1);
}
int main()
{
    printf("%dn", isNegative(-1));
    printf("%dn", isNegative(-0.046));
    printf("%dn", isNegative(3));
    printf("%dn", isNegative(0.253));
}

结果:

1
1
0
0