不二如是 发表于 2020-2-12 07:59:05

05 - 速过浮点类型 |【初尝decimal库】

本帖最后由 不二如是 于 2020-2-12 16:08 编辑

上一讲我们介绍完整数类型,这次来看浮点类型。

Numpy 中浮点(float)分为:float16(半精度)、float32(单精度)、float64(双精度)

浮点的计算机底层结构,科学技术法,偏移,我们就不讲啦,因为会跑的很远,大家也不见得跟得上。

不信吗?

就拿单进度来 float32 来说,它分为:1 位符号,8 位指数,23 位尾数...

指数中又有阶码...

搞懂这些呢,其实对理解 Numpy 也没啥用处。

你只需知道:

**** Hidden Message *****
可爱的狱友们都接受过素质教育,那么告诉我:0.1 + 0.2 = 多少?

没错,记住你给的答案。

我们在 Numpy 中输入看看:

0.1 + 0.2
输出:


怎么肥四??

继续测下这个:

0.1+0.1+0.1-0.3
输出:

按理说是 0,但输出怎么不是 0 呢?

这就是用浮点数计算会来的问题。

如果在金融业,这个就很可怕啦,之前有解释过,这里也不细说啦。

如何得到我们想要的结果呢?

利用 round 方法。

例如我们将 0.1 + 0.2 结果取 1 位:

round(0.1+0.2,1)
输出:


第二个也一样:

round(0.1+0.1+0.1-0.3,1)
输出:


这样就不关心后面的小尾巴了。

不过这种很“鲁莽”,生生的切数字!

decimal 库

更好的做法就是使用 decimal 用于计算十进制数。

需要导入:

from decimal import Decimal
然后看下 0.1 存在计算机中是什么样子:

Decimal(0.1)
输出:


相加时如何避免后面的一堆数呢?

可以先转为字符串(整数可以不写 ' '):

a = Decimal('0.1')
b = Decimal('0.2')
a+b
输出:


不循环小数也可以:

a = Decimal('10')
b = Decimal('3')
a/b
输出:


我们有的时候不需要太多位数,就可以使用 getcontext()

看一下官方的使用说明:

from decimal import getcontext
c = getcontext()
c
输出:


输出里面对应的都是参数说明,重点关注 prec 。

它代表位数,28 意味着有 28 位。

我们手动将其缩小,再来跑一下:

c.prec = 2
a = Decimal('10')
b = Decimal('3')
a/b
结果你们自己试~


Numpy 中浮点类型的坑

我们用半精度 float16 创建一个数组:

arr1 = np.array(,dtype=np.float16).reshape(2,2)
arr1
输出:


计算机中精度不同,存在的值会有误差。

例如先用到向量化计算,为每位 * 10000:

arr1 *10000
输出:


如果一开始我们就用默认的 float64,再来看:

arr2 = np.array(,dtype=np.float64).reshape(2,2)
arr2 * 10000
输出:


这个输出就是我们要的。

如果数字精度要求非常高,浮点数的精度就要严格使用。

Numpy 中通过 set_printoptions(precision=?) 来设置精度:

np.set_printoptions(precision=2)
arr3 = np.array().reshape(2,2)
arr3/3


最后科普下浮点类型的精度范围:


[*]float16(f2) 10^5 - 10^-5
[*]float32(f4) 10^38 - 10^-38
[*]float64(f8) 10^308 - 10^-308

精度越大,代表范围越大,各有各的好处。

如果是分布式计算,用 float16 就可以。

日常我们不用特意指定,一律用默认就好。

下一讲,我们学习最常用的索引,切片,花式索引。

源码:



如果有收获,别忘了评分{:10_281:} :

http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif

如果想看更多,请订阅 淘专辑(传送门)(不喜欢更要订阅{:10_297:} )

qiuyouzhi 发表于 2020-2-12 08:20:01

Numpy 好好玩,我要订阅 淘专辑
抢好沙发

Judie 发表于 2020-2-12 08:47:07

怎么和小甲鱼一样的套路未完待续...
{:10_285:}

不二如是 发表于 2020-2-12 09:22:23

Judie 发表于 2020-2-12 08:47
怎么和小甲鱼一样的套路未完待续...

{:10_278:}很快填坑

zltzlt 发表于 2020-2-12 13:25:50

Numpy 好好玩,我已订阅淘专辑{:10_304:}

TCY 发表于 2020-2-12 19:39:03

Numpy 好好玩,我要订阅 淘专辑

ycyanwen 发表于 2020-2-18 22:41:03

Numpy 好好玩,我要订阅 淘专辑

maxliu06 发表于 2020-2-27 10:28:46

Numpy 好好玩,我要订阅 淘专辑

EthanHsiung 发表于 2020-2-27 15:53:08

Numpy 好好玩,我要订阅 淘专辑

syf040916 发表于 2020-3-4 16:09:04

Numpy 好好玩,我要订阅 淘专辑

tjuwlb 发表于 2020-3-7 20:57:35

Numpy 好好玩,我要订阅 淘专辑

一个账号 发表于 2020-3-10 18:47:19

Numpy 好好玩,我要订阅 淘专辑

听风夜雨 发表于 2020-3-30 13:20:17

Numpy 好好玩,我要订阅 淘专辑

WangJS 发表于 2020-3-30 13:31:39

Numpy 好好玩,我要订阅 淘专辑

zsygsnbfsdm 发表于 2020-7-1 16:29:16

Numpy 好好玩,我要订阅 淘专辑

鸭梨先生 发表于 2020-7-13 21:19:18

Numpy 好好玩,我要订阅 淘专辑

卡卡尼西亚 发表于 2020-7-23 14:49:13

Numpy 好好玩,我要订阅 淘专辑

半夜起床不睡觉 发表于 2020-7-28 14:10:57

Numpy 好好玩,

B_Ender 发表于 2020-7-31 15:02:23

Numpy 好好玩,我要订阅 淘专辑

_2_ 发表于 2020-7-31 17:33:24

Numpy 好好玩,我不要订阅 淘专辑
页: [1] 2
查看完整版本: 05 - 速过浮点类型 |【初尝decimal库】