可能重复:
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”,这也是失败的。
有人能指出我可以依赖的浮点属性来获得所需的休息条件吗?
--------------------更新以下---------------
感谢您对此提供的帮助!我在这里学到了很多东西:
我最初的想法确实是正确的,并且确定了要在其上运行的计算机上的结果(Solaris 10,32位),但却无法在我的Linux系统(64位和32位)上运行。
Hans Passant添加的更改使程序也适用于我的系统,这里似乎存在一些我没想到的平台差异,
感谢大家!
答案 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
功能