什么是尾数,尾数的概念及处理方法
类似的情况也会发生在python和很多编程语言中。
这里我以python为例。
0.1 0.2结果:
0.30000000000000000004这个看起来对常规计算影响不大,但是如果是深度学习算法这种庞大的数据计算,可能会产生蝴蝶效应,所以我们有必要知道背后的原因和解决方法。
具体原因:浮点数运算中存在
不确定尾数
(不是BUG
)。那么为什么会有不确定的尾数呢?
这个涉及
编程语言对数字运算的内部实现原理
:计算机中所有数据本质上都要用二进制来存储
。以python为例。对于浮点数,用53位二进制表示小数部分,大概是10-16。
B(0.1)约等于0.00011001100110011001100110011001100110011001110因为二进制和十进制没有严格的等价关系,所以用二进制表示时,0.1实际上是一个无限小的十进制数,python截取的53位无限接近0.1。
将二进制转换为十进制,0.1在python中表示为十进制
D(0.1)大约等于0.100000000000055115123125782702181583404541015625,所以0.1在python中不是一个准确的0.1,实际上是一个无限接近0.1的数。
进一步,当0.1和0.2相加时,计算机内部计算过程为
分别二进制转换——二进制运算——反向转换为十进制——得到一个无限接近0.3的结果
。这就是浮点运算尾数不确定的原因。
当我们试图判断0.1 0.2是否等于0.3时,答案是否定的。
0.1 0.2==0.3 False那么如何才能解决这个问题呢?
解决办法:round函数
Round(0.1 0.2,1)==0.3真圆函数分析
Round(x,d):四舍五入x,d为小数位数。