python 浮点除法
昨天晚上久违地去打了次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 浮点除法的更多相关文章
- python中除法的注意事项
使用python数据处理,代码如下: import numpy as np fs = 5 ts = np.arange(-1,1+1/fs,1/fs) 发现了这样一个错误: Traceback (mo ...
- Python学习---除法
python有两种除法,普通除法 a/b ,不论a,b精度 得到的都是浮点数. 4/2 = 2.0 3/5 = 0.6 floor除法,a//b , 得到一个舍弃小数位的整数结果,所以结果永远是 ...
- Python浮点算术:争议和限制
浮点数在计算机硬件中表示为以 2 为基数(二进制)的小数.举例而言,十进制的小数 0.125 等于 1/10 + 2/100 + 5/1000 ,同理,二进制的小数 0.001 等于0/2 + 0/4 ...
- Python中除法:/和//
在Python中,除法有两种:/和//. X / Y 对于Python2.X来说,如果两个操作数都是整数,那么结果将向下取整(这个和C里面的不同,C里面是向0取整),也就是说,如果结果本来是-2.5, ...
- python负数除法与模运算
1.负数除法: >>> print 45/76>>> print -45/7-7 >>> print 45/-7-7 >>> p ...
- python中除法的几种类型
传统除法:直接后缀小数点,同样结果是和最大的小数点对齐 >>> 1/2 0 >>> 1.0/2 0.5 >>> 1/2.0 0.5 >> ...
- Python (2) 除法
/ 除法 自动转化为浮动数 // 整除 只保留整数部分 >>> 2/21.0>>> 2//21>>> 1 ...
- 【python】python2.x中的除法
在生信分析中有许多时候我们需要用到除法,在经历无数次break out 之后我终于发现原来python 2.x中只有整除,而没有浮点除法,这就是没有基础的弊病. 那么如何在python 2.x中运用除 ...
- python征程1.2(初识python)
1.操作符. 和其他绝大多数语言一样,Python的算术操作符以你熟悉的方式工作. “+,—,×,/,//,%,**,” 注意:python有两种除法操作符(1)单斜杠用以传统除法,(2)双斜杠用以浮 ...
- [Python学习笔记1]Python语言基础 数学运算符 字符串 列表
这个系列是我在学习Python语言的过程中记录的笔记,主要是一些知识点汇总,而非学习教程,可供有一定编程基础者参考.文中偏见和不足难以避免,仅供参考,欢迎批评指正. 本系列笔记主要参考文献是官网文档: ...
随机推荐
- jwt二次加密失败原因(Bad “options.expiresIn“ option the payload already has an “exp“ property.)
在写vue+nodejs项目的校验token时,出现了次错误 然后想了想问题所在: 第一次加密的时候使用jwt.sign(value,秘钥,{}),会返回一个字符串,然后当前端跳转别的发送请求时,会将 ...
- php textarea根据回车转换成数组
$val是textarea文本框的内容 假如是:张三/32岁/男 李四/28岁/男 $arr=explode("\n",$val); $arr2 = array(); foreac ...
- 1067- invalid default value for ""
创建表时报的,一个时间字段类型是datetime,一保存就报错,网上说是datetime类型只支持mysql 5.6.5+,我看了下我的版本,5.8的,没什么问题,然后找了许久找到了错误的地方. 很蠢 ...
- 攻防世界-fileclude
攻防世界的一道文件包含题目 include("文件名"):会将文件中的内容视为代码块接入include所在代码中,输出的只是执行后的结果,文件中的注释.定义等无法查看. 本题中可以 ...
- MYSQL表操作(中篇)--数据类型
1.数据类型 数值类型 1.整数类型 整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 作用:存储年龄,等级,id,各种号码等 默认是有符号的 int[(m)][u ...
- Entity Framework生成的SQL语句
var Query= database.Table1.Find(cond, f => f.Table2, f => f.Table3, f => f.Table4, f => ...
- Open review Mitigating Propagation Failures in PINNs using Evolutionary Sampling
与Mitigating Propagation failures in PINNs using Evolutionary Sampling - Orange0005 - 博客园 (cnblogs.co ...
- matlab求解器的选择
可以选择的变步长求解器有:ode45,ode23,ode113,odel5s,ode23s和discret.缺省情况下,具有状态的系统用的是ode45:没有状态的系统用的是discrete. 1)od ...
- Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...
大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误"错误:Failed to download metadata for repo 'AppStr ...
- c++dump
//Minidump.h #pragma once class CMinidump { public: CMinidump(); ~CMinidump(); static void CreateDum ...