13.3 获取数学常量
在数学计算中常需要一些常量,与大多数需要测量才能确定(因而精度有限)的物理常量不同,数学常量不存在精度问题,或者说它们具有无限的精度。但由于一些常数有无限的有效位数,而在实际计算中只能取有限位,所以导致计算结果出现偏差。因此,尽可能地获取满足精度要求的数学常量是无法避免的要求。
下面以数学常数π为例说明获取常数的几种方式。
13.3.1 宏定义(硬编码)方式
下面的语句在一些代码中是相当常见的:
- #define MATH_PI 3.1415926
实际上π是无理数,有无限位,此处只有8位,仅够单精度浮点数(即float类型)的精度,肯定会带入一些计算误差,虽然可能影响不大。如果这个宏用于双精度浮点数计算,则引入的误差将使双精度数运算毫无意义。你需要定义更高的MATH_PI,例如:
- #define MATH_PI 3.1415926535897931L
这种方式带来的问题就是大多数硬编码所面对的问题,即维护困难。如果代码中存在多个类似的数学常数,还会产生一致性问题。在一些特殊情况下,例如可变精度计算时,这种方式无法使用。因为计算的精度可变,硬编码设置的精度要么过低要么过高,而这会破坏精度一致性。
【责任编辑:
董书 TEL:(010)68476606】