马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 不二如是 于 2020-2-12 16:08 编辑
上一讲我们介绍完整数类型,这次来看浮点类型。
Numpy 中浮点(float)分为:float16(半精度)、float32(单精度)、float64(双精度)
浮点的计算机底层结构,科学技术法,偏移,我们就不讲啦,因为会跑的很远,大家也不见得跟得上。
不信吗?
就拿单进度来 float32 来说,它分为:1 位符号,8 位指数,23 位尾数...
指数中又有阶码...
搞懂这些呢,其实对理解 Numpy 也没啥用处。
你只需知道:
可爱的狱友们都接受过素质教育,那么告诉我:0.1 + 0.2 = 多少?
没错,记住你给的答案。
我们在 Numpy 中输入看看:
输出:
怎么肥四??
继续测下这个:
输出:
按理说是 0,但输出怎么不是 0 呢?
这就是用浮点数计算会来的问题。
如果在金融业,这个就很可怕啦,之前有解释过,这里也不细说啦。
如何得到我们想要的结果呢?
利用 round 方法。
例如我们将 0.1 + 0.2 结果取 1 位:
输出:
第二个也一样:
输出:
这样就不关心后面的小尾巴了。
不过这种很“鲁莽”,生生的切数字!
decimal 库
更好的做法就是使用 decimal 用于计算十进制数。
需要导入:
from decimal import 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([1.1,2.2,3.3,4],dtype=np.float16).reshape(2,2)
arr1
输出:
计算机中精度不同,存在的值会有误差。
例如先用到向量化计算,为每位 * 10000:
输出:
如果一开始我们就用默认的 float64,再来看:
arr2 = np.array([1.1,2.2,3.3,4],dtype=np.float64).reshape(2,2)
arr2 * 10000
输出:
这个输出就是我们要的。
如果数字精度要求非常高,浮点数的精度就要严格使用。
Numpy 中通过 set_printoptions(precision=?) 来设置精度:
np.set_printoptions(precision=2)
arr3 = np.array([1,2,3,4]).reshape(2,2)
arr3/3
最后科普下浮点类型的精度范围:
- float16(f2) 10^5 - 10^-5
- float32(f4) 10^38 - 10^-38
- float64(f8) 10^308 - 10^-308
精度越大,代表范围越大,各有各的好处。
如果是分布式计算,用 float16 就可以。
日常我们不用特意指定,一律用默认就好。
下一讲,我们学习最常用的索引,切片,花式索引。
源码:
05Float.zip
(448 Bytes, 下载次数: 4, 售价: 3 鱼币)
如果有收获,别忘了评分 :
如果想看更多,请订阅 淘专辑( 传送门)( 不喜欢更要订阅 ) |