热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

整数除法总是等于常规除法的底限吗?

如何解决《整数除法总是等于常规除法的底限吗?》经验,为你挑选了3个好方法。

对于大商,整数除(//)似乎不一定等于常规除(math.floor(a/b))的最低值.

根据Python文档(https://docs.python.org/3/reference/expressions.html - 6.7),

整数的平面划分产生整数; 结果是数学除法的结果,"floor"函数应用于结果.

然而,

math.floor(648705536316023400 / 7) = 92672219473717632

648705536316023400 // 7 = 92672219473717628

'{0:.10f}'.format(648705536316023400 / 7) 收益率'92672219473717632.0000000000',但小数部分的最后两位数应为28而不是32.



1> trincot..:

测试用例中的商不相等的原因是,在这种math.floor(a/b)情况下,结果是使用浮点运算(IEEE-754 64位)计算的,这意味着存在最大精度.你在那里的商大于2 53的限制,高于该限制浮点不再精确到单位.

但是,使用整数除法,Python使用其无限的整数范围,因此结果是正确的.

另见PEP 238中的"真正划分的语义":

请注意,对于int和long参数,真正的除法可能会丢失信息; 这是真正分裂的本质(只要理性不在语言中).有意识地使用longs的算法应该考虑使用//,因为longs的真正划分保留不超过53位的精度(在大多数平台上).



2> interfect..:

您可能正在处理太大而不能完全表示为浮点数的整数值.您的数字明显大于2 ^ 53,这是相邻浮点数双精度之间的间隙开始大于1的位置.因此,在进行浮点除法时会失去一些精度.

另一方面,整数除法是精确计算的.



3> plugwash..:

你的问题是,尽管"/"有时被称为"真正的除法运算符"并且其方法名称是__truediv__,但它对整数的行为不是"真正的数学除法".相反,它产生的浮点结果不可避免地具有有限的精度.

对于足够大的数字,即使数字的整数部分也可能遭受浮点舍入误差.当648705536316023400转换为Python float(IEEE double)时,它将四舍五入为648705536316023424 1.

我似乎无法找到关于当前Python中内置类型的运算符的确切行为的权威文档.引入该特征的原始PEP表明"/"等效于将整数转换为浮点然后执行浮点除法.然而,Python 3.5中的快速测试表明情况并非如此.如果是,那么以下代码将不产生输出.

for i in range(648705536316023400,648705536316123400):
    if math.floor(i/7) != math.floor(float(i)/7):
        print(i)

但至少对我来说它确实产生了输出.

相反,在我看来,Python正在对所呈现的数字执行除法,并将结果四舍五入以适合浮点数.以该程序输出为例.

648705536316123383 // 7                   == 92672219473731911
math.floor(648705536316123383 / 7)        == 92672219473731904
math.floor(float(648705536316123383) / 7) == 92672219473731920
int(float(92672219473731911))             == 92672219473731904

Python标准库确实提供了Fraction类型,并且除以int的Fraction的除法运算符执行"真正的数学除法".

math.floor(Fraction(648705536316023400) / 7) == 92672219473717628
math.floor(Fraction(648705536316123383) / 7) == 92672219473731911

但是,您应该了解使用Fraction类型可能带来的严重性能和内存影响.记住,分数可以增加存储需求而不会增加幅度.


为了进一步测试我的"四舍五对二"的理论,我用以下代码进行了测试.

#!/usr/bin/python3
from fractions import Fraction
edt = 0
eft = 0
base = 1000000000010000000000
top = base + 1000000
for i in range(base,top):
    ex = (Fraction(i)/7)
    di = (i/7)
    fl = (float(i)/7)
    ed = abs(ex-Fraction(di))
    ef = abs(ex-Fraction(fl))
    edt += ed
    eft += ef
print(edt/10000000000)
print(eft/10000000000)

并且直接执行除法的平均误差幅度要小于首先转换为浮点数的平均误差幅度,支持一次舍入与两次理论.

1请注意,直接打印浮点数不会显示其精确值,而是显示将舍入到该值的最短十进制数(允许从浮点数到字符串并返回浮点数的无损往返转换).


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
author-avatar
宝泉岭_白饭如霜些_350
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有