Python论坛  - 讨论区

标题:[python-chinese] 一个基础又奇怪的问题,关于浮点数

2007年09月12日 星期三 10:04

Yuheng Hu wonderfulhoo在gmail.com
星期三 九月 12 10:04:41 HKT 2007

请看:

IDLE 1.2.1
>>> 1.9 + 2.0 == 3.9
True
>>> 1.9 + 2.3 == 4.2
False
>>>

能解释为什么吗?

-- 
Regards,

Yuheng Hu

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:10

limodou limodou在gmail.com
星期三 九月 12 10:10:35 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 请看:
>
> IDLE 1.2.1
> >>> 1.9 + 2.0 == 3.9
> True
> >>> 1.9 + 2.3 == 4.2
> False
> >>>
>
> 能解释为什么吗?
>
这与浮点数的内部表示有关:

>>> 1.9 + 2.0 == 3.9
True
>>> 1.9 + 2.3 == 4.2
False
>>> 1.9 + 2.3
4.1999999999999993
>>> 4.2
4.2000000000000002
>>> 1.9 + 2.0
3.8999999999999999
>>> 3.9
3.8999999999999999

可以看出内部表示一样时值是一样的.

不过对于浮点数是不能这样比较的,一般来说要比较一个精度,在这个精度之内就可以了,如两个金额是否相等,一般也是表示为浮点数,一般是:

abs(je1-je2) < 0.005

这时就认为相等.
-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:15

faitherQ faitherQ在163.com
星期三 九月 12 10:15:02 HKT 2007

>>> 1.9+2.3
4.1999999999999993

ȷʵ²»¶®




faitherQ
2007-09-12



·¢¼þÈË£º Yuheng Hu
·¢ËÍʱ¼ä£º 2007-09-12 10:04:55
ÊÕ¼þÈË£º python-chinese在lists.python.cn
³­ËÍ£º 
Ö÷Ì⣺ [python-chinese] Ò»¸ö»ù´¡ÓÖÆæ¹ÖµÄÎÊÌ⣬¹ØÓÚ¸¡µãÊý

Çë¿´£º

IDLE 1.2.1
> > > 1.9 + 2.0 == 3.9
True
> > > 1.9 + 2.3 == 4.2
False
> > >

ÄܽâÊÍΪʲôÂð£¿

-- 
Regards,

Yuheng Hu
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/411c3a7c/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:18

Yuheng Hu wonderfulhoo在gmail.com
星期三 九月 12 10:18:15 HKT 2007

恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生
4.01 == 4.01 为false的情况。然而在IDLE里面,都是相等的,即true

在 07-9-12,limodou<limodou在gmail.com> 写道:
> On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> > 请看:
> >
> > IDLE 1.2.1
> > >>> 1.9 + 2.0 == 3.9
> > True
> > >>> 1.9 + 2.3 == 4.2
> > False
> > >>>
> >
> > 能解释为什么吗?
> >
> 这与浮点数的内部表示有关:
>
> >>> 1.9 + 2.0 == 3.9
> True
> >>> 1.9 + 2.3 == 4.2
> False
> >>> 1.9 + 2.3
> 4.1999999999999993
> >>> 4.2
> 4.2000000000000002
> >>> 1.9 + 2.0
> 3.8999999999999999
> >>> 3.9
> 3.8999999999999999
>
> 可以看出内部表示一样时值是一样的.
>
> 不过对于浮点数是不能这样比较的,一般来说要比较一个精度,在这个精度之内就可以了,如两个金额是否相等,一般也是表示为浮点数,一般是:
>
> abs(je1-je2) < 0.005
>
> 这时就认为相等.
> --
> I like python!
> UliPad <>: http://code.google.com/p/ulipad/
> My Blog: http://www.donews.net/limodou
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


-- 
Regards,

Yuheng Hu

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:23

BloodMage zhouyisu在gmail.com
星期三 九月 12 10:23:52 HKT 2007

¸¡µãÊýʹÓöþ½øÖƱíʾСÊýµÄ£¬ÈκÎСÊýÔÚÄÚ²¿×ª»»µÄʱºò¶¼»á±ä³Én/(2^-m) *2^k µÄÐÎʽ¡£ÎÊÌâÊÇÐí¶àСÊýÎÞ·¨ÕâÑù¾«È·±íʾ¡£

ÔÚ07-9-12£¬Yuheng Hu <wonderfulhoo在gmail.com> дµÀ£º
>
> ¶÷£¬²»¹ýÎÒ¹ØÐĵÄÊÇÔì³ÉÔ­Òò£¬¼ÈÈ»ºóÃ涼ÊÇËæ»úÊýµÄ»°£¬ÍêÈ«ÓпÉÄܲúÉú
> 4.01 == 4.01 ΪfalseµÄÇé¿ö¡£È»¶øÔÚIDLEÀïÃ棬¶¼ÊÇÏàµÈµÄ£¬¼´true
>
> ÔÚ 07-9-12£¬limodou<limodou在gmail.com> дµÀ£º
> > On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> > > Çë¿´£º
> > >
> > > IDLE 1.2.1
> > > >>> 1.9 + 2.0 == 3.9
> > > True
> > > >>> 1.9 + 2.3 == 4.2
> > > False
> > > >>>
> > >
> > > ÄܽâÊÍΪʲôÂð£¿
> > >
> > ÕâÓ븡µãÊýµÄÄÚ²¿±íʾÓйØ:
> >
> > >>> 1.9 + 2.0 == 3.9
> > True
> > >>> 1.9 + 2.3 == 4.2
> > False
> > >>> 1.9 + 2.3
> > 4.1999999999999993
> > >>> 4.2
> > 4.2000000000000002
> > >>> 1.9 + 2.0
> > 3.8999999999999999
> > >>> 3.9
> > 3.8999999999999999
> >
> > ¿ÉÒÔ¿´³öÄÚ²¿±íʾһÑùʱֵÊÇÒ»ÑùµÄ.
> >
> > ²»¹ý¶ÔÓÚ¸¡µãÊýÊDz»ÄÜÕâÑù±È½ÏµÄ,Ò»°ãÀ´ËµÒª±È½ÏÒ»¸ö¾«¶È,ÔÚÕâ¸ö¾«¶ÈÖ®ÄھͿÉÒÔÁË,ÈçÁ½¸ö½ð¶îÊÇ·ñÏàµÈ,Ò»°ãÒ²ÊDZíʾΪ¸¡µãÊý,Ò»°ãÊÇ:
> >
> > abs(je1-je2) < 0.005
> >
> > Õâʱ¾ÍÈÏΪÏàµÈ£®
> > --
> > I like python!
> > UliPad <>: http://code.google.com/p/ulipad/
> > My Blog: http://www.donews.net/limodou
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>
> --
> Regards,
>
> Yuheng Hu
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/f05f729b/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:24

Wayne moonbingbing在gmail.com
星期三 九月 12 10:24:20 HKT 2007

使用decimal就可以避免这个问题。
>>> from decimal import *
>>> Decimal('1.9') + Decimal('2.3') == Decimal('4.2')
True
>>>
在 07-9-12,Yuheng Hu<wonderfulhoo at gmail.com> 写道:
> 恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生
> 4.01 == 4.01 为false的情况。然而在IDLE里面,都是相等的,即true
>
> 在 07-9-12,limodou<limodou at gmail.com> 写道:
> > On 9/12/07, Yuheng Hu <wonderfulhoo at gmail.com> wrote:
> > > 请看:
> > >
> > > IDLE 1.2.1
> > > >>> 1.9 + 2.0 == 3.9
> > > True
> > > >>> 1.9 + 2.3 == 4.2
> > > False
> > > >>>
> > >
> > > 能解释为什么吗?
> > >
> > 这与浮点数的内部表示有关:
> >
> > >>> 1.9 + 2.0 == 3.9
> > True
> > >>> 1.9 + 2.3 == 4.2
> > False
> > >>> 1.9 + 2.3
> > 4.1999999999999993
> > >>> 4.2
> > 4.2000000000000002
> > >>> 1.9 + 2.0
> > 3.8999999999999999
> > >>> 3.9
> > 3.8999999999999999
> >
> > 可以看出内部表示一样时值是一样的.
> >
> > 不过对于浮点数是不能这样比较的,一般来说要比较一个精度,在这个精度之内就可以了,如两个金额是否相等,一般也是表示为浮点数,一般是:
> >
> > abs(je1-je2) < 0.005
> >
> > 这时就认为相等.
> > --
> > I like python!
> > UliPad <>: http://code.google.com/p/ulipad/
> > My Blog: http://www.donews.net/limodou
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese at lists.python.cn
> > Subscribe: send subscribe to python-chinese-request at lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>
> --
> Regards,
>
> Yuheng Hu
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


-- 
wayne
http://blog.csdn.net/wayne92
Kingsoft(Zhuhai)

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:24

BloodMage zhouyisu在gmail.com
星期三 九月 12 10:24:52 HKT 2007

n/(2^m) *2^k mΪ¹Ì¶¨Êý£¬n<2^mΪÕûÊý£¬kΪָÊý¡£

ÔÚ07-9-12£¬BloodMage <zhouyisu在gmail.com> дµÀ£º
>
> ¸¡µãÊýʹÓöþ½øÖƱíʾСÊýµÄ£¬ÈκÎСÊýÔÚÄÚ²¿×ª»»µÄʱºò¶¼»á±ä³Én/(2^-m) *2^k µÄÐÎʽ¡£ÎÊÌâÊÇÐí¶àСÊýÎÞ·¨ÕâÑù¾«È·±íʾ¡£
>
> ÔÚ07-9-12£¬Yuheng Hu <wonderfulhoo在gmail.com > дµÀ£º
> >
> > ¶÷£¬²»¹ýÎÒ¹ØÐĵÄÊÇÔì³ÉÔ­Òò£¬¼ÈÈ»ºóÃ涼ÊÇËæ»úÊýµÄ»°£¬ÍêÈ«ÓпÉÄܲúÉú
> > 4.01 == 4.01 ΪfalseµÄÇé¿ö¡£È»¶øÔÚIDLEÀïÃ棬¶¼ÊÇÏàµÈµÄ£¬¼´true
> >
> > ÔÚ 07-9-12£¬limodou<limodou在gmail.com> дµÀ£º
> > > On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> > > > Çë¿´£º
> > > >
> > > > IDLE 1.2.1
> > > > >>> 1.9 + 2.0 == 3.9
> > > > True
> > > > >>> 1.9 + 2.3 == 4.2
> > > > False
> > > > >>>
> > > >
> > > > ÄܽâÊÍΪʲôÂð£¿
> > > >
> > > ÕâÓ븡µãÊýµÄÄÚ²¿±íʾÓйØ:
> > >
> > > >>> 1.9 + 2.0 == 3.9
> > > True
> > > >>> 1.9 + 2.3 == 4.2
> > > False
> > > >>> 1.9 + 2.3
> > > 4.1999999999999993
> > > >>> 4.2
> > > 4.2000000000000002
> > > >>> 1.9 + 2.0
> > > 3.8999999999999999
> > > >>> 3.9
> > > 3.8999999999999999
> > >
> > > ¿ÉÒÔ¿´³öÄÚ²¿±íʾһÑùʱֵÊÇÒ»ÑùµÄ.
> > >
> > > ²»¹ý¶ÔÓÚ¸¡µãÊýÊDz»ÄÜÕâÑù±È½ÏµÄ,Ò»°ãÀ´ËµÒª±È½ÏÒ»¸ö¾«¶È,ÔÚÕâ¸ö¾«¶ÈÖ®ÄھͿÉÒÔÁË,ÈçÁ½¸ö½ð¶îÊÇ·ñÏàµÈ,Ò»°ãÒ²ÊDZíʾΪ¸¡µãÊý,Ò»°ãÊÇ:
> > >
> > > abs(je1-je2) < 0.005
> > >
> > > Õâʱ¾ÍÈÏΪÏàµÈ£®
> > > --
> > > I like python!
> > > UliPad <>: http://code.google.com/p/ulipad/
> > > My Blog: http://www.donews.net/limodou
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > > Detail Info: http://python.cn/mailman/listinfo/python-chinese
> >
> >
> > --
> > Regards,
> >
> > Yuheng Hu
> > _______________________________________________
> > python-chinese
> > Post: send python-chinese在lists.python.cn
> > Subscribe: send subscribe to python-chinese-request在lists.python.cn
> > Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> > Detail Info: http://python.cn/mailman/listinfo/python-chinese
>
>
>
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/fc913aa3/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:26

King Cheung python21st在gmail.com
星期三 九月 12 10:26:47 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
>
> ¶÷£¬²»¹ýÎÒ¹ØÐĵÄÊÇÔì³ÉÔ­Òò£¬¼ÈÈ»ºóÃ涼ÊÇËæ»úÊýµÄ»°£¬ÍêÈ«ÓпÉÄܲúÉú
> 4.01 == 4.01 ΪfalseµÄÇé¿ö¡£È»¶øÔÚIDLEÀïÃ棬¶¼ÊÇÏàµÈµÄ£¬¼´true


Õâ¸ö²»ÊÇËæ»úÊý°É¡£¾ÍÊÇÒ»¸ö¸¡µã±íʾµÄÎÊÌâ¡£




-- 
python!
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/2d44c2eb/attachment-0001.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:27

Leo Jay python.leojay在gmail.com
星期三 九月 12 10:27:56 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 请看:
>
> IDLE 1.2.1
> >>> 1.9 + 2.0 == 3.9
> True
> >>> 1.9 + 2.3 == 4.2
> False
> >>>
>
> 能解释为什么吗?
>

小数部分由十进制转二进制的方法就是一直去掉整数部分,小数部分乘2,直到小数部分为0为止。
如:0.625转为二进制:
0.625*2 = 1.25,  整数部分为1,小数部分为0.25
0.25 * 2 = 0.5 ,  整数部分为0,小数部分为0.5
0.5  * 2 = 1   ,    整数部分为1,小数部分为0
所以0.625转为二进制的结果就是0.101
但是,有些小数,如0.2,再怎么乘2,小数部分也不会得到0的,所以,就有误差了。

在输出的时候你可以用格式控制来指定小数位数,如:"%.2f" % (11/3.0)会输出3.67
或者可以用decimal模块来做精确的运算。


-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:29

limodou limodou在gmail.com
星期三 九月 12 10:29:12 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生
> 4.01 == 4.01 为false的情况。然而在IDLE里面,都是相等的,即true
>
那你要看计算机的原理之类的东西了,在计算机里浮点数与整数的表示是不同的,找些资料看一下吧,充充电.而且后面并不是随机数.对于浮点来说,计算机的处理与我们平时的理解并不太一致,这是计算机构造决定了.

而且对于 4.01 == 4.01
是不会产生False的.而你的上例是一个表达式与一个浮点数的比较.在表达示计算中是有可能与直接写一个浮点数产生的表示不一样,这是由于在计算过程中可能会产生一点点误差,所以只要比较一个精度范围就可以了.

-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:31

limodou limodou在gmail.com
星期三 九月 12 10:31:00 HKT 2007

On 9/12/07, Wayne <moonbingbing在gmail.com> wrote:
> 使用decimal就可以避免这个问题。
> >>> from decimal import *
> >>> Decimal('1.9') + Decimal('2.3') == Decimal('4.2')
> True

不错使用库可以解决,单纯在python中通过内置的处理目前是不行的.

-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:34

Yuheng Hu wonderfulhoo在gmail.com
星期三 九月 12 10:34:00 HKT 2007

实际应用中,当然不会用浮点数来比较 :)
问题在我忽然对这个问题感兴趣了~
我就想问,在同一次编译过程中,浮点数的随机过程是不是一样的?

在 07-9-12,BloodMage<zhouyisu在gmail.com> 写道:
> n/(2^m) *2^k m为固定数,n<2^m为整数,k为指数。
>
> 在07-9-12,BloodMage <zhouyisu在gmail.com> 写道:
> > 浮点数使用二进制表示小数的,任何小数在内部转换的时候都会变成n/(2^-m) *2^k
> 的形式。问题是许多小数无法这样精确表示。
> >
> >
> > 在07-9-12,Yuheng Hu < wonderfulhoo在gmail.com > 写道:
> >
> > > 恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生
> > > 4.01 == 4.01 为false的情况。然而在IDLE里面,都是相等的,即true
> > >
> > > 在 07-9-12,limodou<limodou在gmail.com> 写道:
> > > > On 9/12/07, Yuheng Hu < wonderfulhoo在gmail.com> wrote:
> > > > > 请看:
> > > > >
> > > > > IDLE 1.2.1
> > > > > >>> 1.9 + 2.0 == 3.9
> > > > > True
> > > > > >>> 1.9 + 2.3 == 4.2
> > > > > False
> > > > > >>>
> > > > >
> > > > > 能解释为什么吗?
> > > > >
> > > > 这与浮点数的内部表示有关:
> > > >
> > > > >>> 1.9 + 2.0 == 3.9
> > > > True
> > > > >>> 1.9 + 2.3 == 4.2
> > > > False
> > > > >>> 1.9 + 2.3
> > > > 4.1999999999999993
> > > > >>> 4.2
> > > > 4.2000000000000002
> > > > >>> 1.9 + 2.0
> > > > 3.8999999999999999
> > > > >>> 3.9
> > > > 3.8999999999999999
> > > >
> > > > 可以看出内部表示一样时值是一样的.
> > > >
> > > >
> 不过对于浮点数是不能这样比较的,一般来说要比较一个精度,在这个精度之内就可以了,如两个金额是否相等,一般也是表示为浮点数,一般是:
> > > >
> > > > abs(je1-je2) < 0.005
> > > >
> > > > 这时就认为相等.
> > > > --
> > > > I like python!
> > > > UliPad <>:
> http://code.google.com/p/ulipad/
> > > > My Blog: http://www.donews.net/limodou
> > > > _______________________________________________
> > > > python-chinese
> > > > Post: send python-chinese在lists.python.cn
> > > > Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> > > > Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> > > > Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
> > >
> > >
> > > --
> > > Regards,
> > >
> > > Yuheng Hu
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chinese在lists.python.cn
> > > Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> > > Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> > > Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
> >
> >
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>


-- 
Regards,

Yuheng Hu

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:39

King Cheung python21st在gmail.com
星期三 九月 12 10:39:52 HKT 2007

On 9/12/07, Leo Jay <python.leojay在gmail.com> wrote:
>
> On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> > Çë¿´£º
> >
> > IDLE 1.2.1
> > >>> 1.9 + 2.0 == 3.9
> > True
> > >>> 1.9 + 2.3 == 4.2
> > False
> > >>>
> >
> > ÄܽâÊÍΪʲôÂð£¿
> >
>
> СÊý²¿·ÖÓÉÊ®½øÖÆת¶þ½øÖƵķ½·¨¾ÍÊÇһֱȥµôÕûÊý²¿·Ö£¬Ð¡Êý²¿·Ö³Ë2,Ö±µ½Ð¡Êý²¿·ÖΪ0Ϊֹ¡£
> È磺0.625תΪ¶þ½øÖÆ£º
> 0.625*2 = 1.25,  ÕûÊý²¿·ÖΪ1£¬Ð¡Êý²¿·ÖΪ0.25
> 0.25 * 2 = 0.5 ,  ÕûÊý²¿·ÖΪ0£¬Ð¡Êý²¿·ÖΪ0.5
> 0.5  * 2 = 1   ,    ÕûÊý²¿·ÖΪ1£¬Ð¡Êý²¿·ÖΪ0
> ËùÒÔ0.625תΪ¶þ½øÖƵĽá¹û¾ÍÊÇ0.101
> µ«ÊÇ£¬ÓÐЩСÊý£¬Èç0.2£¬ÔÙÔõô³Ë2£¬Ð¡Êý²¿·ÖÒ²²»»áµÃµ½0µÄ£¬ËùÒÔ£¬¾ÍÓÐÎó²îÁË¡£
>
> ÔÚÊä³öµÄʱºòÄã¿ÉÒÔÓøñʽ¿ØÖÆÀ´Ö¸¶¨Ð¡ÊýλÊý£¬È磺"%.2f" % (11/3.0)»áÊä³ö3.67
> »òÕß¿ÉÒÔÓÃdecimalÄ£¿éÀ´×ö¾«È·µÄÔËËã¡£


¶ÔÓÚÕâ¸ö£¬²»Í¬µÄÓ²¼þʵÏÖÊDz»Ò»ÑùµÄ¡£ÏÖÔÚ¼ÆËã»ú³£ÓõÄIEEEµÄ±ê×¼£¬·ÖΪ»ùÊýºÍ½×ÊýÁ½²¿·Ö¡£»¹¸ö£¬Èç¹ûÐèÒªµÄ»°£¬¿ÉÒÔÈ¥¿´¼ÆËã»ú×é³ÉÔ­ÀíÖ®ÀàµÄÊé¡£




-- 
python!
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/68fdfe26/attachment-0001.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:40

Leo Jay python.leojay在gmail.com
星期三 九月 12 10:40:10 HKT 2007

On 9/12/07, limodou <limodou在gmail.com> wrote:
> On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> > 恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生
> > 4.01 == 4.01 为false的情况。然而在IDLE里面,都是相等的,即true
> >
> 那你要看计算机的原理之类的东西了,在计算机里浮点数与整数的表示是不同的,找些资料看一下吧,充充电.而且后面并不是随机数.对于浮点来说,计算机的处理与我们平时的理解并不太一致,这是计算机构造决定了.
>
> 而且对于 4.01 == 4.01
> 是不会产生False的.而你的上例是一个表达式与一个浮点数的比较.在表达示计算中是有可能与直接写一个浮点数产生的表示不一样,这是由于在计算过程中可能会产生一点点误差,所以只要比较一个精度范围就可以了.
>


是这样的,2进制不能精确的表示2.3与1.9。所以,两者相加会让误差变大,
所以会出现2.3+1.9!=4.2的情况

>>> 2.3
2.2999999999999998
>>> 1.9
1.8999999999999999
>>> 4.2
4.2000000000000002

通常,在做浮点运算的时候,不要直接比较两个浮点数是否相等,
两者的差在一定的范围内即可
>>> abs(4.2-(2.3+1.9)) < 1e-8
True

-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:41

limodou limodou在gmail.com
星期三 九月 12 10:41:20 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 实际应用中,当然不会用浮点数来比较 :)
> 问题在我忽然对这个问题感兴趣了~
> 我就想问,在同一次编译过程中,浮点数的随机过程是不是一样的?
>
建议你再看一看回信:

1. 根本不是什么随机数,也不是什么随机过程
2. 表达式与直接写浮点数是不同的.表达式是多个浮点数计算出来的结果
3. 直接的浮点数的生成规则当然是一样的了,但是你比较的是表达式与浮点数

-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:42

King Cheung python21st在gmail.com
星期三 九月 12 10:42:04 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
>
> ʵ¼ÊÓ¦ÓÃÖУ¬µ±È»²»»áÓø¡µãÊýÀ´±È½Ï :)
> ÎÊÌâÔÚÎÒºöÈ»¶ÔÕâ¸öÎÊÌâ¸ÐÐËȤÁË~
> ÎÒ¾ÍÏëÎÊ£¬ÔÚͬһ´Î±àÒë¹ý³ÌÖУ¬¸¡µãÊýµÄËæ»ú¹ý³ÌÊDz»ÊÇÒ»ÑùµÄ£¿


Õâ¸öûÓÐËæ»ú֮˵°É£¬¼ÆËã»úÕâÖÖ¶þ½øÖƺÍÂß¼­ÔËËãµÄ¶«Î÷£¬Ã»ÓÐËæ»úÕâÖÖ¸ÅÄî°É¡£Õâ¸ö»¹ÊǸ¡µã±íʾµÄÎÊÌâ¡£ÏëÉîÈëÁ˽⣬½¨ÒéÈ¥¿´¼ÆËã»ú×é³ÉÔ­ÀíÖ®ÀàµÄÊé¡£




-- 
python!
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/730f1f16/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:42

Yuheng Hu wonderfulhoo在gmail.com
星期三 九月 12 10:42:06 HKT 2007

那个人能解释下编译器处理4.01 == 4.01的过程?

2007/9/12, limodou <limodou在gmail.com>:
> On 9/12/07, Wayne <moonbingbing在gmail.com> wrote:
> > 使用decimal就可以避免这个问题。
> > >>> from decimal import *
> > >>> Decimal('1.9') + Decimal('2.3') == Decimal('4.2')
> > True
>
> 不错使用库可以解决,单纯在python中通过内置的处理目前是不行的.
>
> --
> I like python!
> UliPad <>: http://code.google.com/p/ulipad/
> My Blog: http://www.donews.net/limodou
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


-- 
Regards,

Yuheng Hu

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:49

Leo Jay python.leojay在gmail.com
星期三 九月 12 10:49:25 HKT 2007

On 9/12/07, King Cheung <python21st在gmail.com> wrote:
> >
> > 小数部分由十进制转二进制的方法就是一直去掉整数部分,小数部分乘2,直到小数部分为0为止。
> > 如:0.625转为二进制:
> > 0.625*2 = 1.25,  整数部分为1,小数部分为0.25
> > 0.25 * 2 = 0.5 ,  整数部分为0,小数部分为0.5
> > 0.5  * 2 = 1   ,    整数部分为1,小数部分为0
> > 所以0.625转为二进制的结果就是0.101
> > 但是,有些小数,如0.2,再怎么乘2,小数部分也不会得到0的,所以,就有误差了。
> >
> > 在输出的时候你可以用格式控制来指定小数位数,如:"%.2f" % (11/3.0)会输出3.67
> > 或者可以用decimal模块来做精确的运算。
>
> 对于这个,不同的硬件实现是不一样的。现在计算机常用的IEEE的标准,分为基数和阶数两部分。还个,如果需要的话,可以去看计算机组成原理之类的书。
>

我们在讨论x86,不是吗?intel从8087就开始使用这个标准了。

ieee的浮点数应该是分三部分:符号位,阶码和尾数。


-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:50

limodou limodou在gmail.com
星期三 九月 12 10:50:37 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 那个人能解释下编译器处理4.01 == 4.01的过程?
>
一个浮点数的直接表式规则是相同的,我没有看过Python的源代码,但是我想可能就是直接转为C的double或float类型,如:

(double)4.01 == (double)4.01

底层的C的处理是一致的,python也就是一致的.

-- 
I like python!
UliPad <>: http://code.google.com/p/ulipad/
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:52

Leo Jay python.leojay在gmail.com
星期三 九月 12 10:52:15 HKT 2007

On 9/12/07, Yuheng Hu <wonderfulhoo在gmail.com> wrote:
> 那个人能解释下编译器处理4.01 == 4.01的过程?
>

你想了解什么?

实际上,比较两个4.01的时候,并不是真的在比4.01
>>> 4.01
4.0099999999999998

当你写4.01 == 4.01时候,实际上比的是两个4.0099999999999998
这两个数字虽然不是精确的4.01,但它们确实是相等的。
所以会返回True


-- 
Best Regards,
Leo Jay

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年09月12日 星期三 10:55

King Cheung python21st在gmail.com
星期三 九月 12 10:55:41 HKT 2007

On 9/12/07, Leo Jay <python.leojay在gmail.com> wrote:
>
> On 9/12/07, King Cheung <python21st在gmail.com> wrote:
> > >
> > > СÊý²¿·ÖÓÉÊ®½øÖÆת¶þ½øÖƵķ½·¨¾ÍÊÇһֱȥµôÕûÊý²¿·Ö£¬Ð¡Êý²¿·Ö³Ë2,Ö±µ½Ð¡Êý²¿·ÖΪ0Ϊֹ¡£
> > > È磺0.625תΪ¶þ½øÖÆ£º
> > > 0.625*2 = 1.25,  ÕûÊý²¿·ÖΪ1£¬Ð¡Êý²¿·ÖΪ0.25
> > > 0.25 * 2 = 0.5 ,  ÕûÊý²¿·ÖΪ0£¬Ð¡Êý²¿·ÖΪ0.5
> > > 0.5  * 2 = 1   ,    ÕûÊý²¿·ÖΪ1£¬Ð¡Êý²¿·ÖΪ0
> > > ËùÒÔ0.625תΪ¶þ½øÖƵĽá¹û¾ÍÊÇ0.101
> > > µ«ÊÇ£¬ÓÐЩСÊý£¬Èç0.2£¬ÔÙÔõô³Ë2£¬Ð¡Êý²¿·ÖÒ²²»»áµÃµ½0µÄ£¬ËùÒÔ£¬¾ÍÓÐÎó²îÁË¡£
> > >
> > > ÔÚÊä³öµÄʱºòÄã¿ÉÒÔÓøñʽ¿ØÖÆÀ´Ö¸¶¨Ð¡ÊýλÊý£¬È磺"%.2f" % (11/3.0)»áÊä³ö3.67
> > > »òÕß¿ÉÒÔÓÃdecimalÄ£¿éÀ´×ö¾«È·µÄÔËËã¡£
> >
> > ¶ÔÓÚÕâ¸ö£¬²»Í¬µÄÓ²¼þʵÏÖÊDz»Ò»ÑùµÄ¡£ÏÖÔÚ¼ÆËã»ú³£ÓõÄIEEEµÄ±ê×¼£¬·ÖΪ»ùÊýºÍ½×ÊýÁ½²¿·Ö¡£»¹¸ö£¬Èç¹ûÐèÒªµÄ»°£¬¿ÉÒÔÈ¥¿´¼ÆËã»ú×é³ÉÔ­ÀíÖ®ÀàµÄÊé¡£
> >
>
> ÎÒÃÇÔÚÌÖÂÛx86£¬²»ÊÇÂð£¿intel´Ó8087¾Í¿ªÊ¼Ê¹ÓÃÕâ¸ö±ê×¼ÁË¡£
>
> ieeeµÄ¸¡µãÊýÓ¦¸ÃÊÇ·ÖÈý²¿·Ö£º·ûºÅ룬½×ÂëºÍβÊý¡£


¶Ô£¡ÊÇÎÒûдÇå³þ£¡ºÇºÇ¡£±§Ç¸¡£
Ö÷ÒªÊÇX86ÊǸ¡µãÔËËãµÄ£¬Èç¹ûÊǶ¨µã¾ÍÓÐÁíһ˵ÁË¡£




-- 
python!
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070912/5913bf2a/attachment.htm 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号