Luk*_*keN 5 c floating-point floating-accuracy
首先,这是一个家庭作业问题,只是为了立即解决这个问题.我当然不是在寻找一种勺子喂食的解决方案,只是指向正确的方向.
所以,我的任务是找到无法表示为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",这也失败了.
有人能指出我可以依赖的浮点属性来获得理想的休息条件吗?
--------------------更新以下---------------
感谢您对此的帮助!我在这里学到了很多东西:
我原来的想法确实是正确的,并确定了它打算运行的机器上的结果(Solaris 10,32位),但却无法在我的Linux系统(64位和32位)上运行.
Hans Passant添加的更改使程序也适用于我的系统,这里似乎存在一些我没想到的平台差异,
谢谢大家!
问题是你的相等测试是一个浮点测试.在我变量将被转换的第一浮动并且当然产生相同的浮动.将float转换回int以获得整数相等性测试:
float result = (float)i;
int truncated = (int)result;
if (truncated != i) break;
Run Code Online (Sandbox Code Playgroud)
如果它以数字16开头,那么你找到了正确的数字.将其转换为十六进制并解释为什么那是一个失败的等级奖金.