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…

ubuntu设置代理 的三种方式

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 转载自&#xff1a;http://www.cnblogs.com/lexus/archive/2012/02/20/2359229.html ubuntu下设置代理 2010-01-11 20:13:20| 分类&am…

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

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;会将查询的表的每个字段的具体信息列出来,查询的行数…

DB级buffer与IO 查看

--buffer中缓存每个数据库所占的buffer SET TRAN ISOLATION LEVEL READ UNCOMMITTED SELECT ISNULL(DB_NAME(database_id), ResourceDb) AS DatabaseName , CAST(COUNT(row_count) * 8.0 / (1024.0) AS DECIMAL(28,2)) AS [Size (MB)] FROM sys.dm_os_buffer_descriptors…

SparkSQL DataFrame基础篇

SparkSQL DataFrame基础篇 SparkSQL DataFrame进阶篇 SparkSQL DataFrame基础篇 Spark 2.2及以后的SparkSession替换了Spark以前版本中的SparkContext和SQLContext&#xff0c;为Spark集群提供了唯一的入口点。 val spark SparkSession.builder().appName(“SparkExample”)…

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;确实需要不断地…

Redis常用概念简介

Redis支持五种数据类型1、string是redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类…

.net Mvc Controller 接收 Json/post方式 数组 字典 类型 复杂对象

原文地址&#xff1a;http://www.cnblogs.com/fannyatg/archive/2012/04/16/2451611.html ------------------------------------------------------------------------------------------------------------------ Asp.net Mvc Controller Json数组接收数组字典 类型 复杂对象…

SparkSQL DataFrame进阶篇

SparkSQL DataFrame基础篇 SparkSQL DataFrame进阶篇 1.创建SparkSession【2.0】和 SQLContext实例【1.x】 1.创建SparkSession【2.0】 ///spark2.0后&#xff0c;用sparksession代替sparkcontext和sqlcontext的创建 val spark SparkSession.builder().appName("SparkS…

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

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

ubuntu如何杀死进程

一、得到所有进程 先用命令查询出所有进程 ps -ef 二、杀死进程 我们使用ps -ef命令之后&#xff0c;就会得到一些列进程信息&#xff0c;有进程pid什么的&#xff0c;如果你要杀死莫个进程的话&#xff0c;直接使用命令kill pid

Oracle to_char() to_date() to_number()函数

TO_CHAR 是把日期或数字转换为字符串TO_DATE 是把字符串转换为数据库中得日期类型转换函数TO_NUMBER 将字符转化为数字 TO_CHAR 使用TO_CHAR函数处理数字 TO_CHAR(number, 格式) TO_CHAR(salary,’$99,999.99’); 使用TO_CHAR函数处理日期 TO_CHAR(date,’格式’);  TO_NUM…

妄想性仮想人格障害 新手教程 +改动器

记得上次 HM 教程以后 我如今 继续写 Teatime 新作新手教程 首先我说下 此游戏 模式 AI2机械迷城 一共同拥有5关,结局从文本分析应该至少有两个 本文不是教你怎么玩通结局 安装没什么说的,APP就能够还不明确的上网找找教程 进入游戏后 首先要注意 上面的时间,一个是MM 生命 另外…

如何在宝塔面板启用 ASP.NET CORE 网站并自动申请 HTTPS 证书

要想在 Linux 上部署 ASP.NET CORE 网站&#xff0c;除了使用“宇内流云”大神的 Jexus 之外就是使用 Nginx 对 ASP.NET CORE 网站进行反向代理。常规的做法是在服务器上部署完成 ASP.NET 运行环境、网站程序之后&#xff0c;使用 Supervisor 对网站程序进程进行守护。网站程序…

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

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