免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zhaoshj
打印 上一主题 下一主题

请问x是float类型,什么情况下x!=x为真 [复制链接]

论坛徽章:
0
2 [报告]
发表于 2005-07-10 20:36 |只看该作者

请问x是float类型,什么情况下x!=x为真

请看这一例(WIN2000+VC6.0):
  1. /***********************************************
  2. *file name    : float_accuracy.c
  3. *description : x是float类型,什么情况下x!=x为真
  4. *note           : 若在判断x!=x前对x进行了修改,则
  5.                   有可能使x!=x为真
  6. *author        : kernelxu
  7. *resource     : http://bbs.chinaunix.net/forum/
  8.                       viewtopic.php?t=575049&show_type=
  9. *date            : 2005/07/10
  10. ***********************************************/

  11. #include <stdio.h>;

  12. /**********************************************
  13. *function name :     main()
  14. ***********************************************/
  15. int main(void)
  16. {
  17.         float x = (float)1e-3;

  18.         x = x + 1;
  19.         if (x != x)
  20.         {
  21.                 printf("x is UNequal to x!!\n");
  22.         }
  23.         else
  24.         {
  25.                 printf("x is equal to x!\n");
  26.         }
  27.    
  28.         return 0;
  29. }/*END OF main()*/
复制代码

结果:
x is UNequal to x!!
在x!=x判断前对x进行了加法运算,x!=x为真

———————————————————————————————————

第二例
  1. /***********************************************
  2. *file name    : float_accuracy.c
  3. *description : x是float类型,什么情况下x!=x为真
  4. *note           : 若在判断x!=x前对x进行了修改,
  5.                   则有可能使x!=x为真
  6. *author       : kernelxu
  7. *resource    : http://bbs.chinaunix.net/forum/
  8.                      viewtopic.php?t=575049&show_type=
  9. *date          : 2005/07/10
  10. ***********************************************/

  11. #include <stdio.h>;

  12. /**********************************************
  13. *function name :    main()
  14. ***********************************************/
  15. int main(void)
  16. {
  17.         float x = (float)1e-3;

  18.                 x = (float)((int)x + 1);
  19.         if (x != x)
  20.         {
  21.                 printf("x is UNequal to x!!\n");
  22.                
  23.         }
  24.         else
  25.         {
  26.                 printf("x is equal to x!\n");
  27.         }
  28.    
  29.         return 0;
  30. }/*END OF main()*/
复制代码

结果:
x=0.001000
x is equal to x!
在x!=x判断前对x进行了又一种加法运算,x!=x为假

——————————————————————————————————
查看相应汇编代码:
第一例:
x = x + 1;
0040E9DF   fld         dword ptr [ebp-4]
0040E9E2   fadd        dword ptr [string "x = %f\n" (00425000)]
0040E9E8   fst         dword ptr [ebp-4]

第二例:
x = (float)((int)x + 1);
0040E9DF   fld         dword ptr [ebp-4]
0040E9E2   call        __ftol (0040ea2c)
0040E9E7   add         eax,1
0040E9EA   mov         dword ptr [ebp-8],eax
0040E9ED   fild        dword ptr [ebp-8]

0040E9F0   fst         dword ptr [ebp-4]

两种修改的区别就在于:
第一例是做的double型加法;第二例做的是整型加法。double型运算存在误差,且对double型数据进行关系运算本身就存在误差。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP