C 查找不能表示为IEEE-754 32位浮点的最小整数

C 查找不能表示为IEEE-754 32位浮点的最小整数,c,floating-point,floating-accuracy,C,Floating Point,Floating Accuracy,可能重复: 首先,这是一个家庭作业问题,只是想马上澄清一下。当然,我不是在寻找填鸭式的解决方案,也许只是一个指向正确方向的小指针 因此,我的任务是找到不能表示为IEEE-754浮点(32位)的最小正整数。我知道在“5==5.0000000000 1”之类的东西上测试相等性会失败,所以我想我应该简单地循环所有的数字,并以这种方式进行测试: int main(int argc, char **argv) { unsigned int i; /* Loop counter. No need

可能重复:

首先,这是一个家庭作业问题,只是想马上澄清一下。当然,我不是在寻找填鸭式的解决方案,也许只是一个指向正确方向的小指针

因此,我的任务是找到不能表示为IEEE-754浮点(32位)的最小正整数。我知道在“5==5.0000000000 1”之类的东西上测试相等性会失败,所以我想我应该简单地循环所有的数字,并以这种方式进行测试:

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;
}
这失败了。然后我尝试从浮点“result”中减去整数“I”,也就是“I”,希望得到一个“0.000000002”,我可以尝试检测,但也失败了

有人能给我指出一个浮点属性,我可以依赖它来获得所需的中断条件吗

--------------------更新如下---------------

谢谢你在这方面的帮助!我在这里学到了很多东西:

  • 我最初的想法确实是正确的,并决定了它打算在机器上运行的结果(Solaris 10,32位),但在我的Linux系统(64位和32位)上无法工作

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


  • 谢谢大家

    我认为你应该根据浮点数的表示(基数、符号、有效位、指数)进行推理

    这是一个摘录,可以给你一个线索:

    给定格式包括:

    * 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


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

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

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

    这将是
    FLT\u MAX+1
    。请参见
    float.h


    编辑:或者实际上不是。检查
    math.h

    中的
    modf()
    函数如何失败?当我编译并执行你的代码时,输出是16777217。@KennyTM:该死,我还以为我擅长搜索呢!很抱歉复制了。@Henrik:它一直在包装回(INT_MAX->0),并且没有因为结果而中断。@Hans是的,确实有一些较小的数字无法表示。请尝试
    (1谢谢!这成功了,我很高兴我的原始想法被证明是有效的:)