怪异的方法来检查浮点数是否为负
Weird method to check if a float number is negative
在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
相关文章:
- 是否可以在 for 循环中添加两个浮点数?
- 是否有 C++20 浮点数的包装器,使我能够默认宇宙飞船操作员?
- 在打印浮点数之前检查浮点数是否为偶数
- 整数浮点数除以自身是否保证为 1.f?
- 如何确定以浮点数、双精度位数为单位的有效宽度:是否有标准定义?
- 假设浮点数或双 NaN 将始终作为字符串"nan"是否安全?
- 将布尔值或浮点数分配给int32_t是否安全?
- 使用memcpy将浮点数组复制到uint8_t的数组是否有效
- 浮点数的二进制相等比较是否正确
- 怪异的方法来检查浮点数是否为负
- 是否可以对浮点数近似的不同形式进行分类
- 将整数除法到整数是否需要强制转换以浮点数或双精度以更精确
- 模是否在幕后使用浮点数
- 在C++中对浮点变量执行算术时,是否始终需要使用浮点数文字
- 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 是浮点数、双精度数或积分
- 对某些标准流类插入和提取浮点数是否保留其值
- 如何检查浮点数是否为整数
- 浮点数 - C++浮点数是否保证无穷大
- 如何判断双精度浮点数是否可以安全地存储为单精度浮点数
- 如何检查一个巨大的浮点数是否为整数