python中浮点数和整数比大小,python中浮点数有最大值限制吗

  python中浮点数和整数比大小,python中浮点数有最大值限制吗

  由于本人学识不足,本文难免有疏漏之处。请留言指正。我将不胜感激。

  最近看了《剑指offer》,里面提到浮点数不能和==直接比较。之前听说过这个问题,但一直没有深入了解。今天查阅了一些资料,做了解释,以供日后参考。

  首先,前言,首先看一个例子:

  # include iostream # include cmath使用命名空间stdint main(){ float a=(float)0.1;float b=(float)0.1;if(a==b)cout a==b endl;else cout a!=b endlfloat c=(float)0.1;double d=(double)0.1;if(c==d)cout c==d endl;else cout c!=d endlfloat e=(float)0.1;float f=(double)0.1;if(ABS(e-f)0.0001)cout e==f endl;否则就滚蛋!=f endl返回0;}这里,输出直接给出如下:

  a==bc!=de==f你可以看到在第二次比较中,C!=d,明明都是0.1,为什么不相等?其实主要还是因为精准。对于计算机来说,能够表达的精度是有限的。为了理解这个问题,我们先介绍一下浮点数在计算机中的表达式。

  二。浮点数的表示在计算机中数字是如何存储和表示的?对于整数,情况相对简单。可以直接按照数学中的十进制转换方法处理,即连续除以2,取余数(转换成二进制)。这不是难点。真正的难点在于十进制数如何转换成二进制码(即浮点数)(注意十进制数和浮点数的区别)。

  当然,从数学的角度来说,十进制小数可以转换成二进制小数(整数部分连续除以2,小数部分连续乘以2),比如125.125D=1111101.001B,但问题是计算机不知道小数点的位置。”根本不会,更别说1111101.001B了。那么计算机是如何处理小数的呢?

  历史上,计算机科学家提出了多种解决方案,最终IEEE 754标准中的解决方案被广泛使用。目前,该标准的最新版本是IEEE std 754-2008。这个标准提出数字系统中的浮点数是数学中实数(小数)的近似,它规定表示浮点数的0和1的序列分为三部分(三个域):

  以32位单精度浮点数为例,其具体转换规则为:首先,用二进制科学计数法表示二进制十进制数,如上面给出的例子111101.001=1.11101001 * 2 ^ 6。符号表示数字的符号(0为正,1为负),所以这里填0。指数代表科学计数方法的指数部分。请注意,这里填充的指数不是之前计算的实际指数,而是等于实际指数加上一个偏移量为2 (e-1)-1的数(指数偏移量),其中e是指数的宽度(位数)。对于32位单精度浮点数,指数宽度为8,所以偏移量为127,所以指数值为133,即10000101。之后的分数表示尾数,即科学计数中的小数部分111101001000000000000000(共23位)。因此,32位浮点数125.125D在计算机中表示为01000010111010010000000000000。

  对于32位单精度浮点数,sign是1位,exponent是8位(指数偏移量是127),fraction是23位。对于64位双精度浮点数,sign是1,exponent是11位(指数偏移量是1023),fraction是52位。

  该程序可用于查看小数在计算机中是如何表示的(即浮点数):

  #include iostream#include位集使用命名空间stdint main(){ float f=1.25;float F2=-1.25;双d=1.25无符号long long ff=*(无符号long long *)f;无符号long long ff2=*(无符号long long *)F2;无符号long long dd=*(无符号long long *)d;bit set 32 ff bit(ff);位集32 ffbit 2(ff2);bit set 64 DD bit(DD);cout ffBit endlcout ffBit2 endlcout ddBit endl返回0;}输出如下所示:

  0111110101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

  0111101100110011001100110011001100111100110011001100110011001100110011001100110011001100111001110011100111001110001111000111111110000011111111111000000011111111111111100000011111

  因此,浮点数一般比较如下:

  浮点f=0.1浮动d=0.1if(ABS(f-d)0.00001)printf( f==d \ n );elseprintf(f!=d \ n’);

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: