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

Luk*_*keN 5 c floating-point floating-accuracy

可能重复:
哪个是IEEE 754 float无法准确表示的第一个整数?

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

所以,我的任务是找到无法表示为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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  1. 我原来的想法确实是正确的,并确定了它打算运行的机器上的结果(Solaris 10,32位),但却无法在我的Linux系统(64位和32位)上运行.

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

谢谢大家!

Han*_*ant 5

问题是你的相等测试是一个浮点测试.在变量将被转换的第一浮动并且当然产生相同的浮动.将float转换回int以获得整数相等性测试:

float result = (float)i;
int truncated = (int)result;
if (truncated != i) break;
Run Code Online (Sandbox Code Playgroud)

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