精华内容
下载资源
问答
  • 浮点数简单来说就是实数,也叫小数,不同于整数,其带有小数部分。浮点数广泛用于统计和科学计算上。现实生活中,我们经常说的一个半小时,其应该用 1.5 个小时来表示。所有浮点数自然存在于生活中,并且广泛存在...

    浮点数简单来说就是实数,也叫小数,不同于整数,其带有小数部分。浮点数广泛用于统计和科学计算上。

    现实生活中,我们经常说的一个半小时,其应该用 1.5 个小时来表示。所有浮点数自然存在于生活中,并且广泛存在生活中。

    所有的浮点数都是近似的。

    >>> 1.2 * 6

    7.199999999999999

    >>> 1.2 * 6 == 7.2 # 它们居然不相等

    False

    所以比较两个浮点数是否相等需要用 abs(a-b)<1e-5 来判断。

    >>> a = 1.2 * 6

    >>> abs(a-7.2) < 1e-5

    True

    至于为何浮点数不同于整数,其值可以认为都是近似值呢?这与采用的进制有关。如在十进制中,三分之一(1/3)就是无法准确表示的,只能近似等于 0.333333。但是这个数在三进制中就可以准确表示为 0.1。同样的情况也发生在二进制中,如十进制中的 0.1 在二进制中就不能准确表示。

    下面以浮点数 10.5 为例介绍浮点数的表示法。浮点数一般分为两部分,整数部分和小数部分。整数部分的表示法和整数的二进制表示法相同,如 10 用二进制数表示就是 1010。

    10 = 8+2 = 23+21 = 0b1010

    小数部分每位的权重依次是 2−1、2−2、2−3、2−4,所以 0.5 就可以表示为 0.1。

    所以 10.5 用二进制数表示为 0b1010.1 = 0b1.0101*23。这就是标准的浮点数表示法,其包括数值部分 0b1.0101 和指数 3。数值部分大于或等于 1 而且小于 2。

    如果用十六进制表示就是:

    0b1.0101*23 =0x1.5*23

    但是我们也不需要每个数都这么来手工计算,Python 提供了函数 hex(),它是浮点数对象的成员函数。下面演示其用法。

    >>> 10.5.hex() # 得到其内部表示法

    '0x1.5000000000000p+3' # 数值部分是0x1.5,指数部分是3

    浮点数的基本运算

    本节继续介绍浮点数的基本运算,包括加减乘除和幂运算。

    1) 加减乘除运算(+-*/)

    和整数一样,浮点数也支持加减乘除等基本运算,运算符号也相同。

    >>> 1.2 + 1.3 # 加法运算

    2.5

    >>> 1.2 - 2.3 # 减法运算

    -1.0999999999999999 # 得到一个近似值

    >>> 1.2 * 2.0 # 乘法运算

    2.4

    >>> 1.2 / 2.0 # 除法运算

    0.6

    2) 幂运算(**)

    浮点数也支持幂运算,符号也是 **。但是负数不支持小数幂的运算。

    >>> 1.2 ** 2

    1.44

    >>> 1.2 ** 2.3

    1.5209567545525315

    >>> -1.2 ** 2 # 等效于-(1.2 ** 2)

    -1.44

    >>> (-1.2) ** 2 # 负数的平方为正数

    1.44

    >>> (-1.2) ** 2.1 # 负数不支持小数幂运算

    Traceback (most recent call last): # 抛出异常

    File "", line 1, in

    ValueError: negative number cannot be raised to a fractional power

    浮点数的其他运算

    1) 将浮点数转换成近似的两个整数的商——as_integer_ratio()

    这是一个浮点数的成员函数。其用法如下:

    >>> a = 0.1 # 操作数

    >>> a.as_integer_ratio()

    (3602879701896397, 36028797018963968)

    >>> 3602879701896397.0 / 36028797018963968 # 两者的值很接近了

    0.1

    2) 判断某个浮点数是否为整数——is_integer()

    这是浮点数对象自带的函数,判断某个浮点数是否为一个整数。其用法如下:

    >>> a = 12.0

    >>> a.is_integer()

    True

    >>> a = 12.0001

    >>> a.is_integer()

    False

    当然这也是一个近似值,如 1.0000000000000001 就被看做 1。下面演示了这种情况。

    >>> 1.0000000000000001.is_integer() # 判断是否可以当作整数使用

    True

    >>> 1.0000000000000001 == 1.0

    True

    展开全文
  • 首先在 CPython 中浮点数总是64位的,这里为了书写方便,假设为32位的IEEE 754浮点数,计算的道理都一样,于是第一位是符号位,后面8位是阶码,最后23位是尾数。0.1换算成二进制:0....

    解释下 0.1+0.1-0.2=0 具体是怎么蒙对的,0.1+0.1+0.1-0.3 怎么就蒙不对了。

    首先在 CPython 中浮点数总是64位的,这里为了书写方便,假设为32位的IEEE 754浮点数,计算的道理都一样,于是第一位是符号位,后面8位是阶码,最后23位是尾数。

    0.1换算成二进制:

    0.000110011001100110011001100110011001100110011001100110011001...

    因为尾数只能有23位所以需要修约,IEEE 754定义的修约的规则可以有四种:取最靠近的(对于中间数0.5,IEEE 754默认修约成偶数,叫做 round half to even,譬如23.5和24.5都取为24),向上取整,向下取整,向靠近0取整。默认的取整规则是取就近的,这个很重要,直接决定了什么数能蒙对,什么数蒙不对。

    0.1再换成以2为基数的幂数,尾数只取23位的话:

    equation?tex=1.10011001100110011001101+%5Ctimes+2%5E%7B-4%7D

    注意最后1100被round成了1101,因为第24位是一个1(于是进位,第23位的0变成1)。因为阶码有-127的移位(单精度),即使真正的2的指数加上127才是存储阶码,所以阶码应该为

    01111111(127)-00000100(4) = 01111011

    再加上尾数和符号位,整个32位(最左端为符号位)就为:

    00111101110011001100110011001101,即3d cc cc cd

    Intel的CPU都是little endian的,我们假设这里的CPU是Intel,所以在进程的虚拟内存中0.1被表示为cd cc cc 3d。

    再看0.2,0.2换成位二进制:

    0.001100110011001100110011001100110011001100110011001100110011...

    因为0.2=0.1*2,所以就是把0.1向左移一位的结果,他和0.1不出意料地具有相同的尾数,只是阶码多了一位:

    equation?tex=1.10011001100110011001101+%5Ctimes+2%5E%7B-3%7D

    同理,这里阶码相当于0.1的阶码加一,于是就是01111011 + 00000001 = 01111100,同理,整个32位(最左端为符号位)就为:

    00111110010011001100110011001101,在little endian的机器内存中就是cd cc 4c 3e。

    那0.1+0.1时又发生了什么呢?两个浮点数相加时,遵循以下步骤:0 操作数检查

    比较阶码大小并完成对阶

    尾数求和运算

    结果规格化(舍入处理)

    首先两个数都不为0(回忆下0是怎么在浮点数中被表示的),阶码也相等,所以直接对尾数求和。两个尾数又相等,求和的结果相当于左移1位,结果是11.00110011001100110011010,溢出了,所以再右移1位以规格化(相当于小数点左移一位),阶码加1,右移的时候末尾的0被舍去,最后尾数变为1.10011001100110011001101,阶码是-4+1=-3,和0.2长得一模一样。

    那如果0.2再加上一个0.1呢?这时候为了得出Python解释器给出的那个结果,我们需要真正使用双精度浮点数了(11位的阶码和52的尾数)。0.1的尾数和阶码分别为1.1001100110011001100110011001100110011001100110011010和-4,请注意尾数原本以110011001结尾,只不过最后这个1后面又是一个1,并且后面大于0.5,于是110011001加一变为110011010,这就是导致0.2+0.1和0.3不一样的根本原因。

    0.2则具有相同的尾数和-3的阶码,做0.1和0.2的加法时,首先把0.1的尾数变为0.11001100110011001100110011001100110011001100110011010以对阶,然后把这个数再和1.1001100110011001100110011001100110011001100110011010相加,结果是

    10.01100110011001100110011001100110011001100110011001110,这个数的尾数是53位的,而且又有溢出,所以应该右移一位,然后舍去最后两位,注意最后两位刚好是中间数,但是根据IEEE 754的默认rounding scheme,应该向前进位变成偶数,所以结果就是

    1.0011001100110011001100110011001100110011001100110100(10被舍去),同时阶码加一变为-2。

    再看0.3是怎么表示的,它的阶码和尾数分别为1.0011001100110011001100110011001100110011001100110011和-2。注意尾数结尾0011后面接着的本应是剩下0011的循环,小于0.5,所以无法进位,所以导致了0.3和0.2+0.1不一样,我们把0.3和0.2+0.1摆在一起,看看区别有多大:

    0.2+0.1:

    1.0011001100110011001100110011001100110011001100110100

    0.3:

    1.0011001100110011001100110011001100110011001100110011

    也就是说只要0.3在最低位加一的话就和0.2+0.1一样了,而尾数的最低位是第52位,再乘上-2的阶码,就是2的负54次方,这个数刚好就是:5.551115123125783e-17。

    展开全文
  • 浮点数简单来说就是实数,也叫小数,不同于整数,其带有小数部分。浮点数广泛用于统计和科学计算上。现实生活中,我们经常说的一个半小时,其应该用 1.5 个小时来表示。所有浮点数自然存在于生活中,并且广泛存在...

    浮点数简单来说就是实数,也叫小数,不同于整数,其带有小数部分。浮点数广泛用于统计和科学计算上。

    现实生活中,我们经常说的一个半小时,其应该用 1.5 个小时来表示。所有浮点数自然存在于生活中,并且广泛存在生活中。

    所有的浮点数都是近似的。

    >>> 1.2 * 6

    7.199999999999999

    >>> 1.2 * 6 == 7.2 # 它们居然不相等

    False

    所以比较两个浮点数是否相等需要用 abs(a-b)<1e-5 来判断。

    >>> a = 1.2 * 6

    >>> abs(a-7.2) < 1e-5

    True

    至于为何浮点数不同于整数,其值可以认为都是近似值呢?这与采用的进制有关。如在十进制中,三分之一(1/3)就是无法准确表示的,只能近似等于 0.333333。但是这个数在三进制中就可以准确表示为 0.1。同样的情况也发生在二进制中,如十进制中的 0.1 在二进制中就不能准确表示。

    下面以浮点数 10.5 为例介绍浮点数的表示法。浮点数一般分为两部分,整数部分和小数部分。整数部分的表示法和整数的二进制表示法相同,如 10 用二进制数表示就是 1010。

    10 = 8+2 = 23+21 = 0b1010

    小数部分每位的权重依次是 2−1、2−2、2−3、2−4,所以 0.5 就可以表示为 0.1。

    所以 10.5 用二进制数表示为 0b1010.1 = 0b1.0101*23。这就是标准的浮点数表示法,其包括数值部分 0b1.0101 和指数 3。数值部分大于或等于 1 而且小于 2。

    如果用十六进制表示就是:

    0b1.0101*23 =0x1.5*23

    但是我们也不需要每个数都这么来手工计算,Python 提供了函数 hex(),它是浮点数对象的成员函数。下面演示其用法。

    >>> 10.5.hex() # 得到其内部表示法

    "0x1.5000000000000p+3" # 数值部分是0x1.5,指数部分是3

    浮点数的基本运算

    本节继续介绍浮点数的基本运算,包括加减乘除和幂运算。

    1) 加减乘除运算(+-*/)

    和整数一样,浮点数也支持加减乘除等基本运算,运算符号也相同。

    >>> 1.2 + 1.3 # 加法运算

    2.5

    >>> 1.2 - 2.3 # 减法运算

    -1.0999999999999999 # 得到一个近似值

    >>> 1.2 * 2.0 # 乘法运算

    2.4

    >>> 1.2 / 2.0 # 除法运算

    0.6

    2) 幂运算(**)

    浮点数也支持幂运算,符号也是 **。但是负数不支持小数幂的运算。

    >>> 1.2 ** 2

    1.44

    >>> 1.2 ** 2.3

    1.5209567545525315

    >>> -1.2 ** 2 # 等效于-(1.2 ** 2)

    -1.44

    >>> (-1.2) ** 2 # 负数的平方为正数

    1.44

    >>> (-1.2) ** 2.1 # 负数不支持小数幂运算

    Traceback (most recent call last): # 抛出异常

    File "", line 1, in

    ValueError: negative number cannot be raised to a fractional power

    浮点数的其他运算

    1) 将浮点数转换成近似的两个整数的商——as_integer_ratio()

    这是一个浮点数的成员函数。其用法如下:

    >>> a = 0.1 # 操作数

    >>> a.as_integer_ratio()

    (3602879701896397, 36028797018963968)

    >>> 3602879701896397.0 / 36028797018963968 # 两者的值很接近了

    0.1

    2) 判断某个浮点数是否为整数——is_integer()

    这是浮点数对象自带的函数,判断某个浮点数是否为一个整数。其用法如下:

    >>> a = 12.0

    >>> a.is_integer()

    True

    >>> a = 12.0001

    >>> a.is_integer()

    False

    当然这也是一个近似值,如 1.0000000000000001 就被看做 1。下面演示了这种情况。

    >>> 1.0000000000000001.is_integer() # 判断是否可以当作整数使用

    True

    >>> 1.0000000000000001 == 1.0

    True

    展开全文
  • Python浮点数精度损失解决办法

    千次阅读 2019-08-12 17:03:41
    在使用Python浮点数运算时可能会出现精度损失,针对这个小问题提出了一种解决方案。

    问题重现

    笔者在有一次需要提取一个浮点数的每一位时,出现下面情况:

    a = 56.76
    bit_1 = int(a/10)
    a = a % 10
    bit_2 = int(a/1)
    a = a % 1
    bit_3 = int(a/0.1)
    a = a % 0.1
    bit_4 = int(a/0.01)
    print(bit_1,bit_2,bit_3,bit_4)

    结果为:

    5 6 7 5
    

    很奇怪,结果应该是5 6 7 6,最后一位却变成了5。

    我们逐行打印结果来一探究竟

    >>> a = 56.76
    >>> a = a % 10
    >>> a
    6.759999999999998
    >>> 

    相比看到这里大家就明白了,原来是使用浮点数导致的精度问题。

    解决方案

    使用round()方法发将精度较高的浮点数四舍五入为精度较低的浮点数即可。

    >>> a
    6.759999999999998
    >>> a = round(a,2)
    >>> a
    6.76
    #每一次对a进行取模运算后,矫正一次小数位数
    a = 56.76
    bit_1 = int(a/10)
    a = a % 10
    a = round(a,2)
    bit_2 = int(a/1)
    a = a % 1
    a = round(a,2)
    bit_3 = int(a/0.1)
    a = a % 0.1
    a = round(a,2)
    bit_4 = int(a/0.01)
    print(bit_1,bit_2,bit_3,bit_4)
    5 6 7 6
    #得到正确结果

    如果确实需要超过17位的精度,可以使用decimal模块配合getcontext方法,感兴趣可以自行了解。

    展开全文
  • Python 浮点数相加

    千次阅读 2020-09-19 01:48:47
    安装 pip3 install PyDecimal from decimal import Decimal a=0.1 b=0.2 print(Decimal(str(a))+Decimal(str(b))) # 0.3
  • 1 from decimal import ...2 getcontext().prec=101#设置浮点数的精度为101位 3 a=Decimal(input()) 4 b=Decimal(input()) 5 print(str(a+b).rstrip('0'))#去掉右边多余的0 转载于:https://www.cnblogs...
  • 1、浮点数计算出错 a=1.1 ...而python是以双精度(64)位来保存浮点数,多余的位会被截掉,所以看到的是0.1,但在电脑上实际保存的已不是精确的0.1。 【注意】 这是二进制浮点数的自然性质:它不是 Pyt
  • 求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0 输入描述: 对于每组案例,每组测试数据占2行,分别是两个加数...
  • a = input() b = input() print(int(a)*int(b))
  • 加法运算,其不能针对字符串,但是文件操作得到的就是字符串,那么就需要先将从文件得到的字符串转化成数值型对象,如整数,或者浮点数,然后进行加法运算。1) 转换成整型——int()该函数将小数部分丢掉,该操作...
  • js的浮点数加法

    2015-12-01 12:37:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 原因解释: 浮点数(小数)在...python是以双精度(64bit)来保存浮点数的,后面多余的会被砍掉,所以在电脑上实际保存的已经小于0.1的值了,后面拿来参与运算就产生了误差。 解决办法: 使用decimal库 from decim
  • Python 中浮点类型之间的运算,其结果并不像我们想象的那样,例如: >>> 0.1+0.2 0.30000000000000004 >>> 0.1+0.1-0.2 0.0 >>> 0.1+0.1+0.1-0.3 5.551115123125783e-17 >>> ...
  • 无意之中使用32位的python27计算了
  • python中,浮点数运算,经常会碰到如下情况:? 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确。 比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:0....
  • 当两个浮点数大小相差过大时,较小的浮点数右移太多位导致有效位全部丢失,比如: >>> 10**15+1.0 1000000000000001.0 >>> 10**16+1.0 1e+16 # 浮点数1.0完全丢失,没加上 >>> 0.3+0.6 ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • //这是计算机中浮点数按二进制存储,有些无限循环数据造成不精确,python、javascript等都会有这个问题。 另外,提一句,关于0.1 + 0.2 == 0.3的比较,最好使用 0.1+0.2-0.3(某一个精度值)做判断。 转载于:...
  • 不像其他语言需要借助专门的库,python天生支持...今天在做题的时候需要用到超大数的除法,我就傻傻的实现了针对字符串的四则运算,因为我计算除法用到乘法和减法,而乘法需要加法。后来想起来python里的数值可以是...
  • python浮点数算法

    2017-04-01 16:47:01
     本菜基本完结了pos机的第二个页面,但是还是遇到了不少问题,本次总结其中之一,浮点数的计算。  统计商品数量时,本来是直接加一就可以,但是本菜觉得应该照顾一下论斤买的商品,于是直接把 += 1 改为了 +=0.5,...
  • 首先在 CPython 中浮点数总是64位的,这里为了书写方便,假设为32位的IEEE 754浮点数,计算的道理都一样,于是第一位是符号位,后面8位是阶码,最后23位是尾数。0.1换算成二进制:0....
  • 大家好,老 Amy 来了。之前就意识到一个问题,但是最近又有...是的,浮点数在运算过程中并没有保证完全精确,是什么原因导致了这种现象呢?很多朋友就会窃喜:“这不就是 Python 的 bug 嘛~” 但实际上,这并不是 Pyth
  • python整数和浮点数

    2020-10-15 16:46:54
    整数和浮点数1、四则运算2、变量与对象 人类发明计算机的初衷就是为了帮助人类快速、准确的进行数学计算。 虽然现在计算机已经可以绘图、聊天、购物,无所不能,但数学计算可从来都是计算机的基本功。 1、四则...
  • 3.14 用Python实现的简单加法器感谢:Brett Cannon任务你想用Python制作一个简单的加法器,使用精确的十进制数(而不是二进制浮点数),并以整洁的纵列显示计算结果。解决方案为了执行计算,必须使用decimal模块。...
  • python中的浮点数计算不精确

    千次阅读 2019-08-02 10:18:26
    python中的浮点数计算不精确
  • python的整数与浮点数

    2021-07-02 22:15:54
    Python中,整数和浮点数虽然属于不同的数值类型,但是在运算上是可以一起运算的 四则运算
  • Python的整数与浮点数Python中,整数和浮点数虽然属于不同的数值类型,但是在运算上是可以一起运算的,这从生活经验出发,也是可以理解的。 1、四则运算: 整数、浮点数可以直接进行四则运算。 加法 num1 = 10 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,533
精华内容 3,013
关键字:

python浮点数加法

python 订阅