如何确定浮点数的值是否为整数?

时间:2014-08-12 21:23:07

标签: c

我有一个程序,我需要在浮点数的情况下打印FLOAT,或者在常规数字的情况下打印INTEGER。

示例伪代码

float num = 1.5; 
if (num mod sizeof(int)==0)
  printf ("INTEGER");
else
  printf("FLOAT");

例如:

  • 1.6将打印“FLOAT”
  • 1.0将打印“INTEGER”

这样的事情会起作用吗?

4 个答案:

答案 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) == 4sizeof(float) == 4上。

无论您认为mod是什么,它都清楚地表明您不了解sizeof运算符的作用。