免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1735 | 回复: 8

[其他] 浮点数相等 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2016-09-28 16:44 |显示全部楼层
            我们知道在编程中一般做法是“如果两个浮点数之差很小就认为它们相等”。


    那么如果不考虑机器的数位限制,理论上 0.9999999999...... 和 1.00000000000......... 两个无限位数的浮点数相等么?




论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2016-09-28 17:08 |显示全部楼层
这不是数学么, 教科书上说了, 可用反证法证明。
假设:0.9999999999...... 和 1.00000000000......... 不等
那么, 我们必然能找到它们間的差异值。
然而无论我们给出多么小的差异值,
0.9999999999...... 和 1.00000000000.........間的差值都比我们给定的值小,
所以: 0.9999999999...... 和 1.00000000000.........間没有差, 就是相等

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2016-09-28 17:21 |显示全部楼层
回复 2# folklore

  我看的文章是这么证明的:
           1/3 + 1/3 + 1/3 = 0.333... + 0.333... + 0.333...
                             1.0 = 0.999...


论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-09-28 17:41 |显示全部楼层
回复 1# zhujiang73

计算机中的浮点数和数学中的实数不是一回事。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2016-09-28 17:46 |显示全部楼层
回复 2# folklore

本质上,0.999... 是 0.9 + 0.09 + 0.009 + ...,这个无穷和式的极限是 1。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-09-28 23:31 |显示全部楼层
回复 1# zhujiang73

>>那么如果不考虑机器的数位限制,理论上 0.9999999999...... 和 1.00000000000......... 两个无限位数的浮点数相等么?

你要讨论的是理论上....
还是要“实务”上的编程??

IEEE 754
http://baike.baidu.com/view/1698149.htm?fromtitle=IEEE754%E6%A0%87%E5%87%86&fromid=10427270&type=syn

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2016-09-29 00:15 |显示全部楼层
回复 6# jason680

     其实就是写像
  1. fabs(f1 - f2) < 1.00e-07
复制代码
    这样的式子的时候不太舒服,引发了联想...

实数可以用来测量连续的量。理论上,任何实数都可以用无限小数的方式表示,小数点的右边是一个无穷的数列(可以是循环的,也可以是非循环的)。在实际运用中,实数经常被近似成一个有限小数(保留小数点后 n 位,n为正整数)。在计算机领域,由于计算机只能存储有限的小数位数,实数经常用浮点数来表示。”

        这就是说,计算机不能表示“无穷小”,实数连续,浮点数不连续,在一般情况下浮点数够用。


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-09-29 00:42 |显示全部楼层
回复 7# zhujiang73

would you like it as below:

fabs(f1 - f2) < 1.00e-07    ==> feq(f1, f2)

==   ==>  eq, feq
!=    ==>  ne, fne
<     ==>  lt, flt
<=   ==>  le, fle
>     ==>  gt, fgt
>=   ==>  ge, fge


论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
发表于 2016-09-29 01:05 |显示全部楼层
回复 8# jason680

  有人建议这样:
  1. 最后的比较算法就是:

  2. //  函数:   bool IsEqual(float f1, float f2, int absDelta)

  3. //  功能:把比较两个浮点数是否近似相同

  4. //  输入:f1, f2参与比较的两个浮点数

  5. //               absDelta 两个浮点数之间允许有多少个其他可以精确表达的浮点数存在,相当于相对误差

  6. //  输出:   true,两个浮点数进行相等; false 两个浮点数不等

  7. //  注意:仅仅适合IEEE 32位浮点数结构

  8. bool IsEqual(float f1, float f2, int absDelta)

  9. {

  10.        int i1, i2;

  11.        i1 = ( f1>0)  ? ((int&)f1)  : ( (int&) f1 - 0x80000000 );

  12.        i2 = (f2>0)  ? ((int&)f2)  : ( (int&) f2 - 0x80000000 );

  13.        return   ((abs(i1-i2))<absDelta) ? true : false;

  14. }
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP