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”,我可以尝试检测,但也失败了
有人能给我指出一个浮点属性,我可以依赖它来获得所需的中断条件吗
--------------------更新如下---------------
谢谢你在这方面的帮助!我在这里学到了很多东西:
谢谢大家 我认为你应该根据浮点数的表示(基数、符号、有效位、指数)进行推理 这是一个摘录,可以给你一个线索: 给定格式包括:
* 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谢谢!这成功了,我很高兴我的原始想法被证明是有效的:)