13.3.3 算法方式
算法方式有简单的,也有复杂的。简单的只需调用一个数学函数即可得到有关的常数,复杂的则需实现专用算法。
(1)使用函数库
如果你的系统有数学函数库,那么用下列语句即可得到π:
- double MATH_PI = 2.0* acos(0.0);
这种方式的优点是实现简单,而且获得的数学常量的精度与数学函数库的精度是一致的。需要注意的是要注意选择库函数和输入参数。尽量选择收敛快、精度高的函数,选择输入参数时也是如此。例如:
- double MATH_PI = 2.0* asin(1.0);
- double MATH_PI = 4.0* atan(1.0);
也可以返回同样的结果,但许多asin()是基于atan()实现的,因此使用asin()的效率没有atan()高。不过,使用atan()要注意定义域,当输入参数趋于无穷时,atan()的计算精度大幅度下降。
(2)专用算法
如果由于某些原因无法使用函数库,或者在某些地方要求的精度超出了函数库所能达到的精度,那么需要实现一些算法。如果要求的精度超过了常规浮点格式(例如双精度格式)的精度,那么还需要实现更高的浮点格式及其加、减、乘、除和开方运算,例如CSuperFloat。
不同的数学常数有不同的计算方法,有些常数(例如π)还有专用的快速算法。不过,快速算法有时有些晦涩或较难实现,因此需要根据需求决定是否使用,不可一味追求速度,带来不必要的开发难度。
4.5节和6.5节用同一种算法针对不同数据类型实现了π的计算,有兴趣的读者可以参阅。
在附带源码的Other目录下有一个PI工程,它通过递归计算内接圆面积计算π。
【责任编辑:
董书 TEL:(010)68476606】