浮点数相等
我们知道在编程中一般做法是“如果两个浮点数之差很小就认为它们相等”。那么如果不考虑机器的数位限制,理论上 0.9999999999...... 和 1.00000000000......... 两个无限位数的浮点数相等么?
这不是数学么, 教科书上说了, 可用反证法证明。
假设:0.9999999999...... 和 1.00000000000......... 不等
那么, 我们必然能找到它们間的差异值。
然而无论我们给出多么小的差异值,
0.9999999999...... 和 1.00000000000.........間的差值都比我们给定的值小,
所以: 0.9999999999...... 和 1.00000000000.........間没有差, 就是相等 回复 2# folklore
我看的文章是这么证明的:
1/3 + 1/3 + 1/3 = 0.333... + 0.333... + 0.333...
1.0 = 0.999...
:mrgreen::luya:
回复 1# zhujiang73
计算机中的浮点数和数学中的实数不是一回事。 回复 2# folklore
本质上,0.999... 是 0.9 + 0.09 + 0.009 + ...,这个无穷和式的极限是 1。 回复 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 回复 6# jason680
其实就是写像 fabs(f1 - f2) < 1.00e-07 这样的式子的时候不太舒服,引发了联想...
“实数可以用来测量连续的量。理论上,任何实数都可以用无限小数的方式表示,小数点的右边是一个无穷的数列(可以是循环的,也可以是非循环的)。在实际运用中,实数经常被近似成一个有限小数(保留小数点后 n 位,n为正整数)。在计算机领域,由于计算机只能存储有限的小数位数,实数经常用浮点数来表示。”
这就是说,计算机不能表示“无穷小”,实数连续,浮点数不连续,在一般情况下浮点数够用。
回复 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
回复 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]