python浮点数类型与数学_Python3标准库:decimal定点数和浮点数的数学运算

1. decimal定点数和浮点数的数学运算

decimal模块实现了定点和浮点算术运算,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模式(即大多数计算机硬件实现的IEEE浮点数运算)。Decimal实例可以准确的表示如何数,对其上火其下取整,还可以限制有效数字的个数。

1.1 Decimal

小数值被表示为Decimal类的实例。构造函数取一个整数或字符串作为参数。在使用浮点数创建Decimal之前,可以先将浮点数转换为一个字符串,以使调用者能够显式的处理值的位数,因为如果使用硬件浮点数表示则可能无法准确的表述。或者,类方法from_float()可以把浮点数转换为精确的小数表示。

importdecimal

fmt= '{0:<25} {1:<25}'

print(fmt.format('Input', 'Output'))print(fmt.format('-' * 25, '-' * 25))#Integer

print(fmt.format(5, decimal.Decimal(5)))#String

print(fmt.format('3.14', decimal.Decimal('3.14')))#Float

f = 0.1

print(fmt.format(repr(f), decimal.Decimal(str(f))))print('{:<0.23g} {:<25}'.format(

f,

str(decimal.Decimal.from_float(f))[:25])

)

浮点值0.1并没有被表示为一个精确的二进制值,所以float的表示与Decimal值不同。在这个输出的最后一行,完整的字符串表示被截断为25个字符。

1823516-20200229201147462-1344926195.png

Decimal还可以由元组创建,其中包含一个符号标志(0表示正,1表示负)、由数位组成的一个tuple以及一个整数指数。

importdecimal#Tuple

t = (1, (1, 1), -2)print('Input :', t)print('Decimal:', decimal.Decimal(t))

基于元组的表示在创建时不太方便,不过它提供了一种可移植的方式,这样可以导出小数值而不损失精度。元组形式可以通过网络传输,或者在不支持精确小数值的数据库中存储,以后再转换回Decimal实例。

1823516-20200229201521354-1773472657.png

1.2 格式化

Decimal对应Python的字符串格式化协议,使用与其他数值类型一样的语法和选项。

importdecimal

d= decimal.Decimal(1.1)print('Precision:')print('{:.1}'.format(d))print('{:.2}'.format(d))print('{:.3}'.format(d))print('{:.18}'.format(d))print('\nWidth and precision combined:')print('{:5.1f} {:5.1g}'.format(d, d))print('{:5.2f} {:5.2g}'.format(d, d))print('{:5.2f} {:5.2g}'.format(d, d))print('\nZero padding:')print('{:05.1}'.format(d))print('{:05.2}'.format(d))print('{:05.3}'.format(d))

格式字符串可以控制输出的宽度,精度(即有效数字个数),以及其填充值以占满宽度的方式。

1823516-20200229202155022-432792550.png

1.3 算术运算

Decimal重载了简单的算术操作符,所以可以采用与内置数值类型相同的方式来处理Decimal实例。

importdecimal

a= decimal.Decimal('5.1')

b= decimal.Decimal('3.14')

c= 4d= 3.14

print('a =', repr(a))print('b =', repr(b))print('c =', repr(c))print('d =', repr(d))print()print('a + b =', a +b)print('a - b =', a -b)print('a * b =', a *b)print('a / b =', a /b)print()print('a + c =', a +c)print('a - c =', a -c)print('a * c =', a *c)print('a / c =', a /c)print()print('a + d =', end=' ')try:print(a +d)exceptTypeError as e:print(e)

Decimal操作符还接受整数参数,不过,在这些操作符使用浮点值之前必须把浮点值转换为Decimal实例。

1823516-20200229202544234-1375165135.png

除了基本算术运算,Decimal还包括一些方法来查找以10为底的对数和自然对数。log10()和ln()返回的值都是Decimal实例,所以可以与其他值一样在公式中直接使用。

1.4 特殊值

除了期望的数字值,Decimal还可以表示很多特殊值,包括正负无穷大值、“不是一个数”(NaN)和0。

importdecimalfor value in ['Infinity', 'NaN', '0']:print(decimal.Decimal(value), decimal.Decimal('-' +value))print()#Math with infinity

print('Infinity + 1:', (decimal.Decimal('Infinity') + 1))print('-Infinity + 1:', (decimal.Decimal('-Infinity') + 1))#Print comparing NaN

print(decimal.Decimal('NaN') == decimal.Decimal('Infinity'))print(decimal.Decimal('NaN') != decimal.Decimal(1))

与无穷大值相加会返回另一个无穷大值。与NaN比较相等性总会返回false,而比较不等性总会返回true。与NaN比较大小来确定排序顺序是未定义的,这会导致一个错误。

1823516-20200229202959741-2068188659.png

1.5 上下文

到目前为止,前面的所有例子使用的都是decimal模块的默认行为。还可以使用一个上下文(context)来覆盖某些设置,如保持的精度、如何完成取整、错误处理等。上下文可以应用于一个线程中的所有Decimal实例,或者在一个小代码区中本地应用。

1.5.1 当前上下文

要获取当前全局上下文,可以使用getcontext()。

importdecimal

context=decimal.getcontext()print('Emax =', context.Emax)print('Emin =', context.Emin)print('capitals =', context.capitals)print('prec =', context.prec)print('rounding =', context.rounding)print('flags =')for f, v incontext.flags.items():print('{}: {}'.format(f, v))print('traps =')for t, v incontext.traps.items():print('{}: {}'.format(t, v))

这个示例脚本显示了Context的公共属性。

1823516-20200229203601834-350476750.png

1.5.2 精度

上下文的prec属性控制了作为算术运算结果创建的新值所要保持的精度。字面量值会按这个属性保持精度。

importdecimal

d= decimal.Decimal('0.123456')for i in range(1, 5):

decimal.getcontext().prec=iprint(i, ':', d, d * 1)

要改变精度,可以直接为这个属性赋一个1到decimal.MAX_PREC之间的新值。

1823516-20200229203903997-370189219.png

1.5.3 取整

取整有多种选择,以保证值在所需的精度范围内。

ROUND_CEILING:总是趋向无穷大向上取整。

ROUND_DOWN:总是趋向0取整。

ROUND_FLOOR:总是趋向负无穷大向下取整。

ROUND_HALF_DOWN:如果最后一个有效数字大于或大于5则朝0反方向取整;负责,趋向0取整。

ROUND_HALF_EVEN:类似于ROUND_HALF_DOWN,不过,如果最后一个有效数字为5,则会检查前一位。偶数值会导致结果向下取整,奇数值导致结果向上取整。

ROUND_HALF_UP:类似于ROUND_HALF_DOWN,不过如果最后一位有效数字为5,则值会朝0的反方向取整。

ROUND_UP:朝0的反方向取整。

ROUND_05UP:如果最后一位是0或5,则朝0的反方向取整;否则向0取整。

importdecimal

context=decimal.getcontext()

ROUNDING_MODES=['ROUND_CEILING','ROUND_DOWN','ROUND_FLOOR','ROUND_HALF_DOWN','ROUND_HALF_EVEN','ROUND_HALF_UP','ROUND_UP','ROUND_05UP',

]

header_fmt= '{:10}' + ' '.join(['{:^8}'] * 6)print(header_fmt.format(' ','1/8 (1)', '-1/8 (1)','1/8 (2)', '-1/8 (2)','1/8 (3)', '-1/8 (3)',

))for rounding_mode inROUNDING_MODES:print('{0:10}'.format(rounding_mode.partition('_')[-1]),

end=' ')for precision in [1, 2, 3]:

context.prec=precision

context.rounding=getattr(decimal, rounding_mode)

value= decimal.Decimal(1) / decimal.Decimal(8)print('{0:^8}'.format(value), end=' ')

value= decimal.Decimal(-1) / decimal.Decimal(8)print('{0:^8}'.format(value), end=' ')print()

这个程序显示了使用不同算法将同一个值取整为不同精度的效果。

1823516-20200229204805641-705215057.png

1.5.4 本地上下文

可以使用with语句对一个代码块应用上下文。

importdecimal

with decimal.localcontext() as c:

c.prec= 2

print('Local precision:', c.prec)print('3.14 / 3 =', (decimal.Decimal('3.14') / 3))print()print('Default precision:', decimal.getcontext().prec)print('3.14 / 3 =', (decimal.Decimal('3.14') / 3))

Context支持with使用的上下文管理器API,所以这个设置只在块内应用。

1823516-20200229204939239-138727391.png

1.5.5 各实例的上下文

还可以用上下文构造Decimal实例,然后从这个上下文继承精度以及转换的取整参数。

importdecimal#Set up a context with limited precision

c =decimal.getcontext().copy()

c.prec= 3

#Create our constant

pi = c.create_decimal('3.1415')#The constant value is rounded off

print('PI :', pi)#The result of using the constant uses the global context

print('RESULT:', decimal.Decimal('2.01') * pi)

例如,这样一来,应用就可以选择与用户数据精度不同的常用值精度。

1823516-20200229205158934-1146325559.png

1.5.6 线程

“全局”上下文实例上是线程本地上下文,所以完全可以使用不同的值分别配置各个线程。

importdecimalimportthreadingfrom queue importPriorityQueueclassMultiplier(threading.Thread):def __init__(self, a, b, prec, q):

self.a=a

self.b=b

self.prec=prec

self.q=q

threading.Thread.__init__(self)defrun(self):

c=decimal.getcontext().copy()

c.prec=self.prec

decimal.setcontext(c)

self.q.put((self.prec, a*b))

a= decimal.Decimal('3.14')

b= decimal.Decimal('1.234')#A PriorityQueue will return values sorted by precision,#no matter what order the threads finish.

q =PriorityQueue()

threads= [Multiplier(a, b, i, q) for i in range(1, 6)]for t inthreads:

t.start()for t inthreads:

t.join()for i in range(5):

prec, value=q.get()print('{} {}'.format(prec, value))

这个例子使用指定的值来创建一个新的上下文,然后安装到每个线程中。

1823516-20200229205415644-1048273102.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

业务功能中包含邮件发送,怎么测试?

前言网站开发中&#xff0c;经常碰到需要发送邮件的场景。比如&#xff0c;重置用户密码&#xff0c;需要执行下列流程&#xff1a;用户在重置页面输入邮箱地址进入邮箱&#xff0c;使用获得的重置链接打开重置页面输入新密码一般来说&#xff0c;重置链接都需要包含一个token值…

如何用CSS让一个容器水平垂直居中?

- 第一类&#xff08;被居中的元素有固定的宽高&#xff09; 效果&#xff1a; 第一种方法&#xff08;绝对定位 负margin&#xff09;<div class"div1"> <div class"div2"></div> </div><style type"text/css"&g…

和男朋友出去玩,该去哪里​?

1 当代熬夜人的脑回路&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 确实需要找一下眼珠子&#xff08;via.剪怪不怪&#xff0c;侵删&#xff09;▼3 原来是老师想太多&#xff08;via.万事屋纸纸酱&#xff0c;侵删&#xff09;▼4 有一个会英语的妈妈&#x…

查询表结构的语句总结

四种方式&#xff1a;① DESC 表名② DESCRIBE 表名③ SHOW COLUMNS FROM 表名④ SHOW CREATE TABLE 表名从以上图片结果中可以看出&#xff1a;show columns 和 desc 和 describe 的结果是一样的&#xff0c;即&#xff1a;会将查询的表的每个字段的具体信息列出来,查询的行数…

ch340串口驱动_关于串口下载问题和超时

串口下载适用于mini、精英、战舰、探索者、阿波罗429不适用于阿波罗767&#xff0c;H743&#xff0c;号令者1052保证板子在独立供电状态下&#xff0c;电源灯处于亮灯状态下&#xff0c;USB线接板子上USB_232&#xff0c;RXD 和 PA9(STM32 的 TXD)TXD 和 PA10(STM32的 RXD)通过…

tcpdump抓取HTTP包

http://blog.csdn.net/kofandlizi/article/details/8106841 cpdump -XvvennSs 0 -i eth0 tcp[20:2]0x4745 or tcp[20:2]0x4854 0x4745 为"GET"前两个字母"GE" 0x4854 为"HTTP"前两个字母"HT" 说明&#xff1a; 通常情况下:一…

cobbler工作流分析

官网 http://cobbler.github.io/ 介绍 Cobbler是一个快速网络安装linux的服务&#xff0c;而且在经过调整也可以支持网络安装windows。该工具使用python开发&#xff0c;小巧轻便&#xff0c;使用简单的命令即可完成PXE网络安装环境的配置&#xff0c;同时还可以管理DHCP、DNS、…

数学到底有多难难难难?看完这个,瞬间觉得智商都提高了!

▲ 点击查看数学家陈省身曾说过&#xff0c;我们每个人一生都花了很多时间学数学&#xff0c;但我们其实只是学会了计算&#xff0c;而不是数学。不知道你有没有听说过这样一句话&#xff1a;想要学好数学&#xff0c;就要靠刷题。尽管我们不得不承认&#xff0c;确实需要不断地…

matlab机械臂工作空间代码_【ROS-Moveit!】机械臂控制探索(3)——基于python的API示例代码分析...

本文参考Moveit!官方文档。系统&#xff1a;ubuntu 18.04 / 16.04ROS&#xff1a;Melodic / Kinetic概述基于python的运动组API是最简单的MoveIt!用户接口。其中提供了用户常用的大量功能封装&#xff0c;例如&#xff1a;设置目标关节控制或笛卡尔空间位置创建运动规划移动机器…

竟然有如何奇葩的如厕方式......

1 密集恐惧症一下子都好啦&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 请选择适合您的如厕方式&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 为什么当年的粉丝没有现在像这样互掐&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 怕什么…

crm开源系统 tp框架_八个开源的 Spring Boot 前后端分离项目,一定要收藏!

点击蓝色字关注我们前后端分离已经在慢慢走进各公司的技术栈&#xff0c;不少公司都已经切换到这个技术栈上面了。即使贵司目前没有切换到这个技术栈上面&#xff0c;也非常建议大家学习一下前后端分离开发&#xff0c;以免在公司干了两三年&#xff0c;SSH 框架用的滚瓜烂熟&a…

Spark运行原理剖析

http://ihoge.cn/2018/Spark%20Scheduler.html Apache Spark是一个开源的&#xff0c;强大的分布式查询和处理引擎。它提供MapReduce的灵活性和可扩展性&#xff0c;但速度明显更高。 Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler则为Spark核心实现的重要一环…

那些奇奇怪怪的男性用品......

1 原来浣熊竟是我自己&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 能不能对全靠运气&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 万万没想到是这个结局&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 真实版出猪车&#xff08;素材来…

.Net Minimal API 介绍

Minimal APIs 是.Net 6 中新增的模板&#xff0c;借助 C# 10 的一些特性以最少的代码运行一个 Web 服务。本文脱离 VS 通过 VS Code&#xff0c;完成一个简单的 Minimal Api 项目的开发。创建项目新建一个文件夹&#xff0c;用来管理我们的项目文件&#xff0c;文件夹内启动命令…

access 子窗体 鼠标滚动不工作_Python GUI项目实战(五)明细信息窗体的完善

前言上一节我们实现了明细窗体GUI的搭建&#xff0c;并且设置了查看、修改、添加三种不同的状态&#xff0c;框架搭建好了&#xff0c;内容并没有填充&#xff0c;本节我们继续完善这个项目&#xff0c;将学生信息填充进明细窗体中。一、填充当前学生信息1.需求目前我们已经实现…

弹性式分布数据集RDD——Pyspark基础 (二)

连载中&#xff1a;http://ihoge.cn/tags/pyspark/ title: 弹性式分布数据集RDD——Pyspark基础 &#xff08;二&#xff09; date: 2018-04-15 17:59:21 comments: true categories: - Spark tags: - pyspark RDD的内部运行方式 RDD不仅是一组不可变的JVM&#xff08;…

导师都有哪些“秘密”没有告诉你?

全世界只有3.14 % 的人关注了爆炸吧知识真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人生的深浅&#xff0c;格局的大小决定了人生之路是宽是窄。今天给大家推荐几个有深度、有想法的公众号&#xff0c;希望能够给你带…

2021年全球知名开源项目大更新

下面简单回顾 2021 年一些带来较大变化和影响的项目更新信息。PHP 8.1.0 正式发布枚举&#xff0c;只读属性&#xff0c;First-class 可调用语法&#xff0c;新的初始化器&#xff0c;纯交集类型&#xff0c;Never 返回类型&#xff0c;Final 类常量&#xff0c;显式八进制数字…

mysql workbench_爬虫实例:玩转mysql(预备篇)

考完试的第一篇文章&#xff0c;开心~/1.什么是数据库/数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程…

RHEL6   Kickstart 无人值守安装

方法&#xff1a;FTPTFTPDHCPKickstartPXE从网络引导系统的做法可以不必从硬盘、软盘或者CD&#xff0d;ROM光盘&#xff0c;而是完全通过网络来引导一台计算机。这对于安装来说很方便&#xff0c;因为它意味着你可以坐在桌子旁边&#xff0c;不必走到机器那里插入CD&#xff0…