美文网首页
第11章 编写精确代码所需编码准则

第11章 编写精确代码所需编码准则

作者: FelixDai | 来源:发表于2019-08-05 09:15 被阅读0次

    11.1 计算机并不如想象得那么精确

    数字电路机器无法准确表示小数。

    11.2 需要进行精确计算时避开浮点数运算

    浮点数的特性决定其无法进行精确计算。

    C语言的float型数据只能保证小数点之后6位小数的精确度,而double型只能保证15位。浮点数运算一直存在这种误差,因此,需要精确计算式,应该用整数而非浮点数。特别是进行金融相关计算时,例如银行或信用卡公司,哪怕只有1元钱的误差,都需要通宵加班查明原因,所以更应尽量避免使用浮点数运算。

    11.3 double型比float型更适合精确计算

    当然,使用比double型更大的long double型或unsigned long double型会更好。

    完全没有办法处理圆周率这种精确度在小数点后数十位以上的数值吗?当然不是。首先,可以用科学计算专用语言FROTRAN编写程序。如果必须用C语言编写,那么可以利用数组实现精确度更高的实数运算,之不过这种编写过程非常复杂。

    11.4 确认整数型大小

    整数型大小取决于计算机的定义,不同计算机定义的整数型大小可能不同。大部分UNIX系列操作系统定义整数型大小位4自己(32位),而PC中常用的操作系统有的定义整数型大小为2字节(16位),有的是4字节(32位)。大型服务器中还存在将int型定义为8字节(64位)的情况。更有甚者,将整数型数据大小定义为9位或40位。因此,最好事先确认整数型数据大小。

    编译器手册中会记录数据类型大小,limits.h文件中也会有相关记载。还有一种确认数据类型大小的方法是,使用sizeof运算符。

    总之,大家应该养成编码之前确认数据类型大小的好习惯,最好能够在变量旁边标注数据类型大小,可以提醒日后负责将该程序移植到PC端任务的程序员,使其对该变量大小多加留意。

    11.5 必须明确计算单位

    在注释中表明当前计算使用的单位

    11.6 特别留意除法运算

    11.7 尽量避免数据类型转换

    数据类型的转换始终存在风险。将高类型(长字节)转换位低类型(短字节)时,会损失一定的数据精度。所以需要进行精确计算的程序中,最好避免此类操作,尤其需要注意是否存在隐式数据类型转换。

    11.8 精通编程语言的语法

    11.9 留意可能出现的非线性计算结果

    复杂系统理论或“蝴蝶效应”的内容众所周知,本书不再赘述。而码农、程序员和系统架构师一定要牢记,计算机反复运算的结果可能远远偏离我们的预期。

    特别是涉及浮点数的话,这种现象尤为突出。浮点数本身并不是一种精确的数值表示形式,如果再对齐进行反复运算,那么结果可能和预期值相差很大。这些数值偏差可能导致沉船、坠机、升降机骤停、发电炸爆炸等事故,而这些事故又可能引发社会混乱、纠纷不断、战争爆发,甚至导致人类灭亡。

    因此,如果在编码、设计程序算法、设计系统框架的过程中需要对细微数据差别进行反复计算,请各位务必多次校验运算结果。

    相关文章

      网友评论

          本文标题:第11章 编写精确代码所需编码准则

          本文链接:https://www.haomeiwen.com/subject/xweydctx.html