zhujiang73 发表于 2016-09-28 16:44

浮点数相等

            我们知道在编程中一般做法是“如果两个浮点数之差很小就认为它们相等”。


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




folklore 发表于 2016-09-28 17:08

这不是数学么, 教科书上说了, 可用反证法证明。
假设:0.9999999999...... 和 1.00000000000......... 不等
那么, 我们必然能找到它们間的差异值。
然而无论我们给出多么小的差异值,
0.9999999999...... 和 1.00000000000.........間的差值都比我们给定的值小,
所以: 0.9999999999...... 和 1.00000000000.........間没有差, 就是相等

zhujiang73 发表于 2016-09-28 17:21

回复 2# folklore

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

:mrgreen::luya:

MMMIX 发表于 2016-09-28 17:41

回复 1# zhujiang73

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

MMMIX 发表于 2016-09-28 17:46

回复 2# folklore

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

jason680 发表于 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

zhujiang73 发表于 2016-09-29 00:15

回复 6# jason680

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

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

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


jason680 发表于 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


zhujiang73 发表于 2016-09-29 01:05

回复 8# jason680

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

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

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

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

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

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

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

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

{

       int i1, i2;

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

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

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

}

页: [1]
查看完整版本: 浮点数相等