昨天晚上久违地去打了次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. for in 和 for of 的区别(枚举解释)

    一.for....of 1.for-of是作为ES6新增的遍历方式,允许遍历一个含有iterator接口的数据结构(数组.对象等)并且返回各项的值,普通的对象用for-of遍历是会报错的. 2.for ...

  2. ls access.log.?.gz

    因为日志文件每天都会打包, 所以昨天的问题可能就在今天的access.log/error.log文件里找不到了.如何找出个位数的log文件呢? 这里就有两种不同的匹配符号, *匹配多个, ?匹配一个, ...

  3. Linux系统配置安装jdk

    菜鸟新人搭建服务器,目前不深入原理,只配置 1.官方自行下载Linux版本jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk ...

  4. windows下C#读文件遇到一个路径的天坑

    在win下面准备了一个文件,右键属性然后"安全"复制完整的文件路径, 放到C#代码(vs中编写)中来读取,竟然死活异常: System.IO.IOException HResult ...

  5. TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0"

    报错: TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0" 解决:sudo apt install libtss2-tcti-t ...

  6. [MicroPython ESP32] 内存分析

    [MicroPython ESP32] 内存分析 [(1)芯片:ESP32-WROOM-DA] 手册: https://www.espressif.com.cn/zh-hans/support/doc ...

  7. ref、reactive、toRef、toRefs使用与区别

    reactive 传参:reactive(arg),arg只能是对象 arg为普通对象 返回响应式对象,不管层级多深,都能响应 使用:获取数据值的时候直接获取,不需要加.value 特点:解构.扩展运 ...

  8. Webservice或WebAPi Post类型传参,类对象格式转换

    有类: public class ImgInfo { public int fs { get; set; } public string FileName { get; set; } public s ...

  9. K8s网络策略

    Network Policy(网络策略) 默认情况下,k8s集群网络是没有任何限制的,Pod可以和任何其他Pod通信,在某些场景下需要做网络控制,减少网络面的攻击,提高安全性,就会用到网络策略(Net ...

  10. 暑假学习二 8.24 Hadoop的环境配置

    今日学习内容: 主要为Hadoop的环境配置,相关配置所需文档可以留言(?)会给发送 1.hadoop介绍: 狭义: 核心组件,Hadoop hdfs  分布存储 yarn   资源管理和任务调度框架 ...