5

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

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

所以,我的任务是找到不能表示为 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 添加的更改使该程序也适用于我的系统,这里似乎存在一些我没想到的平台差异,

谢谢大家!

4

3 回答 3

5

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

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

如果它以数字 16 开头,那么您找到了正确的数字。将其转换为十六进制,并解释为什么那是未能获得等级奖励的原因。

于 2010-10-08T12:00:24.087 回答
1

我认为您应该将浮点数表示为(基数、符号、有效数、指数)

这是维基百科的摘录,可以为您提供线索:

给定的格式包括:

* 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。

于 2010-10-08T11:49:19.047 回答
-1

那将是FLT_MAX+1。见float.h

编辑:或者实际上没有。检查中的modf()功能math.h

于 2010-10-08T12:00:27.080 回答