2007年09月12日 星期三 10:04
请看: IDLE 1.2.1 >>> 1.9 + 2.0 == 3.9 True >>> 1.9 + 2.3 == 4.2 False >>> 能解释为什么吗? -- Regards, Yuheng Hu
2007年09月12日 星期三 10:10
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
2007年09月12日 星期三 10:15
>>> 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
2007年09月12日 星期三 10:18
恩,不过我关心的是造成原因,既然后面都是随机数的话,完全有可能产生 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
2007年09月12日 星期三 10:23
¸¡µãÊýʹÓöþ½øÖƱíʾСÊýµÄ£¬ÈκÎСÊýÔÚÄÚ²¿×ª»»µÄʱºò¶¼»á±ä³É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
2007年09月12日 星期三 10:24
使用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)
2007年09月12日 星期三 10:24
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
2007年09月12日 星期三 10:26
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
2007年09月12日 星期三 10:27
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
2007年09月12日 星期三 10:29
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
2007年09月12日 星期三 10:31
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
2007年09月12日 星期三 10:34
实际应用中,当然不会用浮点数来比较 :) 问题在我忽然对这个问题感兴趣了~ 我就想问,在同一次编译过程中,浮点数的随机过程是不是一样的? 在 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
2007年09月12日 星期三 10:39
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
2007年09月12日 星期三 10:40
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
2007年09月12日 星期三 10:41
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
2007年09月12日 星期三 10:42
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
2007年09月12日 星期三 10:42
那个人能解释下编译器处理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
2007年09月12日 星期三 10:49
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
2007年09月12日 星期三 10:50
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
2007年09月12日 星期三 10:52
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
2007年09月12日 星期三 10:55
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
Zeuux © 2025
京ICP备05028076号