查找无法表示为IEEE-754 32位浮点的最小整数

时间:2010-10-08 11:43:28

标签: c floating-point floating-accuracy

  

可能重复:
  Which is the first integer that an IEEE 754 float is incapable of representing exactly?

首先,这是一个家庭作业问题,只是为了立即解决这个问题。我当然不是在寻找一种勺子喂食的解决方案,只是指向正确的方向。

所以,我的任务是找到无法表示为IEEE-754浮点数(32位)的最小正整数。我知道在“5 == 5.00000000001”之类的东西上测试相等性会失败,所以我想我只是循环遍历所有数字并以这种方式测试它:

int main(int argc, char **argv)
{
    unsigned int i; /* Loop counter. No need to inizialize here. */

    /* Header output */
    printf("IEEE floating point rounding failure detection\n\n");

    /* Main program processing */
    /* Loop over every integer number */
    for (i = 0;; ++i)
    {
        float result = (float)i;

        /* TODO: Break condition for integer wrapping */

        /* Test integer representation against the IEEE-754 representation */
        if (result != i)
            break; /* Break the loop here */
    }

    /* Result output */
    printf("The smallest integer that can not be precisely represented as IEEE-754"
           " is:\n\t%d", i);


    return 0;
}

这失败了。然后我试图从浮点“结果”中减去整数“i”,即“i”希望实现一些我可以尝试检测的“0.000000002”,这也是失败的。

有人能指出我可以依赖的浮点属性来获得所需的休息条件吗?

--------------------更新以下---------------

感谢您对此提供的帮助!我在这里学到了很多东西:

  1. 我最初的想法确实是正确的,并且确定了要在其上运行的计算机上的结果(Solaris 10,32位),但却无法在我的Linux系统(64位和32位)上运行。

  2. Hans Passant添加的更改使程序也适用于我的系统,这里似乎存在一些我没想到的平台差异,

  3. 感谢大家!

3 个答案:

答案 0 :(得分:5)

问题是你的相等测试是一个浮点测试。 i 变量将首先转换为float,当然会生成相同的float。将float转换回int以获得整数相等性测试:

float result = (float)i;
int truncated = (int)result;
if (truncated != i) break;

如果它以数字16开头,那么你找到了正确的数字。将它转换为十六进制并解释为什么那是一个失败的等级奖金。

答案 1 :(得分:2)

我认为你应该将浮点数的表示推理为(基数,符号,有效数,指数)

这是Wikipedia的摘录,可以为您提供线索:

  

给定的格式包括:

* Finite numbers, which may be either base 2 (binary) or base 10
     

(十进制)。每个有限数都是最多的   简单地用三个整数描述:s =   符号(零或一),c =有效数   (或'系数'),q =指数。   有限数的数值   是           (-1)s×c×bq         其中b是基数(2或10)。例如,如果符号为1   (表示否定),有效数字   是12345,指数是-3,和   基数是10,那么值   号码是-12.345。

答案 2 :(得分:0)

那将是FLT_MAX+1。请参阅float.h

编辑:或实际上没有。查看modf()

中的math.h功能