我有一个程序,我需要在浮点数的情况下打印FLOAT,或者在常规数字的情况下打印INTEGER。
示例伪代码
float num = 1.5;
if (num mod sizeof(int)==0)
printf ("INTEGER");
else
printf("FLOAT");
例如:
这样的事情会起作用吗?
答案 0 :(得分:5)
所有浮动类型都具有相同的大小,因此您的方法无法正常工作。您可以使用ceilf
float num = 1.5;
if (ceilf(num) == num)
printf ("INTEGER");
else
printf("FLOAT");
答案 1 :(得分:4)
您可以使用modff()
:
const char * foo (float num) {
float x;
modff(num, &x);
return (num == x) ? "INTEGER" : "FLOAT";
}
modff()
将采用float
参数,并将其分解为整数和小数部分。它将整数部分存储在第二个参数中,并返回小数部分。
答案 2 :(得分:2)
你可以使用roundf
,如下所示:
float z = 1.0f;
if (roundf(z) == z) {
printf("integer\n");
} else {
printf("fraction\n");
}
这个和其他类似技术(例如ceilf
)的问题在于,虽然它们对于整数常量非常有效,但如果数字是一个可能浮动的计算结果,它们将会失败 - 点圆整错误。例如:
float z = powf(powf(3.0f, 0.05f), 20.0f);
if (roundf(z) == z) {
printf("integer\n");
} else {
printf("fraction\n");
}
打印“分数”,即使(3 1/20 ) 20 应该等于3,因为实际计算结果最终为 2.9999992847442626953125
任何类似的方法,无论是fmodf
还是其他什么,都受此限制。在执行复杂或易于舍入的计算的应用程序中,通常您要做的是为构成“整数”的内容定义一些“容差”值(这通常用于浮点相等比较)。我们经常将此容差称为 epsilon 。例如,假设我们原谅计算机最多+/- 0.00001舍入误差。然后,如果我们正在测试z
,我们可以选择0.00100的epsil并执行:
if (fabsf(roundf(z) - z) <= 0.00001f) {
printf("integer\n");
} else {
printf("fraction\n");
}
您真的不想在这里使用ceilf
,例如ceilf(1.0000001)
为2而不是1,ceilf(-1.99999999)
为-1而非-2。
选择适合您的应用的公差值。有关详细信息,请查看comparing floating-point numbers上的这篇文章。
答案 3 :(得分:1)
这样的事情会起作用吗?
没有。例如,在x86_32和ARM 32位体系结构sizeof(int) == 4
和sizeof(float) == 4
上。
无论您认为mod
是什么,它都清楚地表明您不了解sizeof
运算符的作用。