昨天晚上久违地去打了次div2

一年没打,挂得很惨

早上起来试着用python写一遍唯一写出来的a题

然后发现了一个奇怪的现象

代码如下(为了方便观察已经改过了,不是解题的代码)

import sys
x=1
y=100000000
k=100000000
a=k*y+k-1
ans=a/1
print(sys.maxsize)
print(int(a))
print(int(ans))

结果如下:

9223372036854775807
10000000099999999
10000000100000000

输出的第一行是int的最大值,是为了验证异常不是由于溢出导致的。

看到第二个输出,一个算是比较大的数字,第三个输出应当是其除以1的结果。

用小学生的脑子想一想,任意一个数字除以1结果应当不变吧。

但输出告诉我们,我不仅变,我还给你刚好+1。

但如果在这里使用整除的话,第二和第三个结果是一致的。

那么问题大约出在python的浮点数除法的算法上了。

如果将除数改为2,可以看到第三个输出变为

5000000050000000

也就是说,在除法过程中依然出现了+1现象。

如果减小量级呢?

import sys
x=1
y=100000000
k=100000000
a=k+k-1
ans=a/1print(sys.maxsize)
print(int(a))
print(int(ans))

结果如下:

9223372036854775807
199999999
199999999

可以看到,+1现象消失了。

那么推测,+1现象的成因是在浮点运算中为了方便较大数字运算而引入的一个一般情况下可以忽略的填补量。

那么引入这个+1的临界范围是什么?

使用while循环,粗略地探究一下:

import sys
x=1
y=100000000
k=100000000
a=k+k-1
ans=a/1;
while a==ans:
print(int(a))
a*=10
ans=a/1print(sys.maxsize)
print(int(a))
print(int(ans))

结果是:

199999999
1999999990
19999999900
199999999000
1999999990000
19999999900000
199999999000000
1999999990000000
19999999900000000
199999999000000000
1999999990000000000
9223372036854775807
19999999900000000000
19999999900000002048

不对劲啊,为什么是在比int范围还有大的时候才跳出循环,明明之前产生偏差的数值比范围要小。

猜测,这个偏差的产生条件不只是数字的位数,还有其他的条件

观察最开始的那个数据,以及1的特殊性,猜测这个+1的偏差可能和数据的末尾9的个数有关

那么选取一个较小的9结尾的数字开始循环

import sys
a=199999
ans=a/1
while a==ans:
print(a)
a=a*10+9
ans=a/1
print(sys.maxsize)
print(int(a))
print(int(ans))

结果是:

199999
1999999
19999999
199999999
1999999999
19999999999
199999999999
1999999999999
19999999999999
199999999999999
1999999999999999
9223372036854775807
19999999999999999
20000000000000000

可以看到,位数与最初那个有偏差数据一样。

实验到此结束,暂时的结论是,在被除数大到一定程度(暂定17位)且末尾有一定数量9时,在除法运算中会进行一个+1

的填补以方便运算。

至于这个算法具体的优化过程不得而知,想来与现在的结论应该是大相径庭吧,只能留待日后有机会再研究了。

python 浮点除法的更多相关文章

  1. python中除法的注意事项

    使用python数据处理,代码如下: import numpy as np fs = 5 ts = np.arange(-1,1+1/fs,1/fs) 发现了这样一个错误: Traceback (mo ...

  2. Python学习---除法

    python有两种除法,普通除法 a/b ,不论a,b精度 得到的都是浮点数. 4/2 = 2.0    3/5 = 0.6 floor除法,a//b , 得到一个舍弃小数位的整数结果,所以结果永远是 ...

  3. Python浮点算术:争议和限制

    浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数.举例而言,十进制的小数 0.125 等于 1/10 + 2/100 + 5/1000 ,同理,二进制的小数 0.001 等于0/2 + 0/4 ...

  4. Python中除法:/和//

    在Python中,除法有两种:/和//. X / Y 对于Python2.X来说,如果两个操作数都是整数,那么结果将向下取整(这个和C里面的不同,C里面是向0取整),也就是说,如果结果本来是-2.5, ...

  5. python负数除法与模运算

    1.负数除法: >>> print 45/76>>> print -45/7-7 >>> print 45/-7-7 >>> p ...

  6. python中除法的几种类型

    传统除法:直接后缀小数点,同样结果是和最大的小数点对齐 >>> 1/2 0 >>> 1.0/2 0.5 >>> 1/2.0 0.5 >> ...

  7. Python (2) 除法

    /            除法  自动转化为浮动数 //         整除  只保留整数部分 >>> 2/21.0>>> 2//21>>> 1 ...

  8. 【python】python2.x中的除法

    在生信分析中有许多时候我们需要用到除法,在经历无数次break out 之后我终于发现原来python 2.x中只有整除,而没有浮点除法,这就是没有基础的弊病. 那么如何在python 2.x中运用除 ...

  9. python征程1.2(初识python)

    1.操作符. 和其他绝大多数语言一样,Python的算术操作符以你熟悉的方式工作. “+,—,×,/,//,%,**,” 注意:python有两种除法操作符(1)单斜杠用以传统除法,(2)双斜杠用以浮 ...

  10. [Python学习笔记1]Python语言基础 数学运算符 字符串 列表

    这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...

随机推荐

  1. nanopi SOCKS5 代理

    nanopi (SOCKS5+openvpn)  +  阿里ES(openvpn + socat) 构建内网代理. 需求: 公网 阿里ES服务器1台,内网nanopi1个(可连接公网服务器), 想从外 ...

  2. ubuntu 下如何设置环境变量

    一.设置环境变量的三种方法 1.1 临时设置 export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH 1.2 当前用户的全局设置 打开~/. ...

  3. Java除法运算精度问题

    结论:不要将两个int类型的变量直接相除,会出现精度丢失问题,最好将其中一个变量强制转化成浮点型 现象: 两个int类型相除的结果要取整,如果相除得到0.53,那么结果会变成0,出现精度丢失的问题 D ...

  4. 【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享|附代码数据

    原文链接:http://tecdat.cn/?p=10278 最近我们被客户要求撰写关于生存分析的研究报告,包括一些图形和统计输出. 生存分析(也称为工程中的可靠性分析)的目标是在协变量和事件时间之间 ...

  5. Django Cannot assign "A1": "B1" must be a "C1" instance.

    Django Cannot assign "A1": "B1" must be a "C1" instance. 原因:使用了外键 说明:如 ...

  6. 压缩打包,tar

    压缩打包命令 创建压缩包 tar -zcvf /home/xxxx.tar.gz /xahot 解压 tar -zxvf xxx.tar.gz gzip   xxxx  自动变为 xxx.gz

  7. WRF rsl.out文件研究

    本文翻译自https://www2.mmm.ucar.edu/wrf/users/FAQ_files/FAQ_wrf_runtime.html Q1 我应该使用几个处理器来运行wrf.exe? A1 ...

  8. c++ 引用 指针。

    一.什么是引用(reference) ?已经存在的对象的另外一个名字. 引用有什么特别的? 1.引用在定义时,以&开头. 2.引用不是对象,只能绑定在对象上.所以必须在初始化的时候,指定引用绑 ...

  9. Python 元组tuple、 列表list、 字典dict、集合set、迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  10. C# List GroupBy and Sum

    List<PartRequest> partRequests = new List<PartRequest>(); partRequests.Add(new PartReque ...