Numpy 机器精度
在本文中,我们将介绍Numpy中的机器精度,以及如何使用Python来实现计算机的基本数字运算。机器精度是计算机采用浮点数表示实数,能够表示出的最小精度。我们将从基本概念开始,到Numpy中函数的使用,最后提供一些自己实现的算法供读者参考。
阅读更多:Numpy 教程
基本概念
在计算机中,浮点数是由符号位、指数位以及尾数位组成。为了解决超大或者超小的数字表示问题,IEEE754标准定义了单精度float(32位)和双精度double(64位)两种形式。其中float型用1位表示符号位、8位表示指数位、23位表示尾数位;double型用1位表示符号位、11位表示指数位、52位表示尾数位。
在浮点数表示中,精度是由尾数位数目决定的。尾数越多,精度越高。例如,在float型中,最多可以表示7位十进制数。当超过这个限制时,计算机将截取后7位并进行舍入处理。这样就出现了误差,这些误差是计算机处理所带来的,这便是机器精度。总之,机器精度是计算机数值运算本质的显现,也是计算机计算所带来的误差。
Numpy中的函数
Numpy是Python中十分常用的科学计算库,其中包含许多实用函数。下面介绍常用的和机器精度相关的函数。
numpy.finfo
numpy.finfo函数主要返回了浮点数在计算机中的存储规范以及所能表示的精度和值范围。可以通过下面的代码来获取float和double型的信息。
import numpy as np
print(np.finfo(float))
print(np.finfo(float).eps)
print(np.finfo(float).machar.tiny)
print(np.finfo(float).max)
输出结果如下:
Machine parameters for float64
---------------------------------------------------------------
precision = 15 resolution = 1.0000000000000001e-15
machep = -52 eps = 2.220446049250313e-16 epsneg = 1.1102230246251565e-16
init = 2.2250738585072014e-308 max = 1.7976931348623157e+308
nan = nan inf = inf nexp = 11 minexp = -1022 maxexp = 1024
---------------------------------------------------------------
2.220446049250313e-16
2.2250738585072014e-308
1.7976931348623157e+308
从输出结果可以看出,eps表示的是最小的可表示的值;tiny表示的是最小的正表示数;max表示的是最大可表示的值。
numpy.spacing
numpy.spacing函数返回的是相邻数之间的单位距离,即:x与x+dp之间的距离。由于浮点数采用二进制表示,那么相邻的浮点数之间的单位距离应该是非常接近的。通过下面的代码可以看到float型中相邻数的距离,和double型中相邻数的距离。
print(np.spacing(np.float32(1)))
print(np.spacing(np.float64(1)))
输出结果如下:
1.1920929e-07
2.220446049250313e-16
从输出结果可以看出,float型中相邻数的距离大约是10^{-7},而double型中相邻数的距离则大约是10^{-16}。
numpy.nextafter
numpy.nextafter函数可以返回比指定数稍大或稍小的第一个可表示数字。可以使用以下代码查看float型中9.9的下一个可表示数字。
print(np.nextafter(np.float32(9.9), np.float32(10)))
输出结果如下:
9.9000006
从输出结果可以看出,float型中9.9的下一个可表示数字是9.9000006。
自行实现
在Python中,我们也可以自行实现与机器精度相关的算法。下面我将介绍两种常见的算法。
O(h^2)算法
O(h^2)算法是一个标准的近似数值导数算法,在Python中可以这样实现:
def derivative(f, x, h=1e-10):
return (f(x+h) - f(x-h)) / (2*h)
其中,f是需要求导的函数,x是需要求导的点,h是微分的步长。当h太大的时候,精度会降低;当h太小时,计算会变慢,同时浮点数的截断误差也会增大。
O(h^4)算法
更加高级的算法是O(h^4)算法,可以进一步增加精度。下面是Python的实现代码。
def derivative(f, x, h=1e-10):
return (-f(x+2*h) + 8*f(x+h) - 8*f(x-h) + f(x-2*h)) / (12*h)
使用O(h^4)算法时,步长h要比O(h^2)算法使命小,从而更加容易受到计算机产生的误差的影响。因此,高阶方法可能需要更多的计算。
总结
本文介绍了机器精度的基本概念,以及Numpy库中与机器精度相关的函数。同时,我们也给出了两种自行实现的算法,希望对读者有所帮助。在实际应用中,需要考虑到精度和计算速度之间的平衡,选择适合的算法。