编码修养系列----编写精确代码必学篇


程序员尼克

一、计算机并不如想象的精确

  • 从根本上讲,计算机是用电位差进行计算操作的机器。高电位为1,低电位为0,运算时只需要0和1.所有数字机器都遵循这个原理。
  • 二进制能表示十进制的0.1,0.1,0.3,0.4,0.6吗? 不能!

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

  • 浮点数的特性决定它无法进行精确计算,也就是说,它一直存在误差。
  • c语言中的float只能保证小数点后6位小数的精确度
  • 而double只能保证15位
  • 假如计算1/3+1/3,计算机给的答案是0.666667(float型)
  • 但其实是2/3
  • 因此我们需要精确计算时,应该用整数而非浮点数。

三、double型比float型更适合精确计算

  • double型运算和float运算的速度几乎相差无几
  • 既然速度差异不明显,那么考虑到精确度,我们应该使用double型运算

四、确认整数型大小

  • 在pc操作系统中,32位系统中int型大小为4字节
  • 16位系统中整型大小为2字节
  • 64位操作系统中int型大小为8字节
  • 当然它们各自表示的范围也不同
  • 因此我们应该养成在编码前确认数据类型大小的好习惯,最好在变量旁标注数据类型大小
int number = 7000; //int型大小为4字节

五、必须明确计算单位

  • 程序中的变量要是有实际意义,你要给出它的单位嘛,不然谁看到懂
sum = sum +(num / 1000); //num以元为单位,sum以千元为单位
total = total + (sum / 1000); //sum以千元为单位,total以百万元为单位

六、尽量避免数据类型转换

  • 长字节转换为短字节时,精度会丢失
  • 防止出现隐式转换的方法是,在变量名前添加可表示数据类型的前缀,如下:
double dpi = 3.14159;
long int liNum;
long int liRad;
......
liNUm = dpi * liRad * liRad;
  • 声明并使用这些变量后,可以第一时间发现可能存在的不同数据类型变量之间进行的乘法或赋值运算

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

  • 蝴蝶效应,同样适用于计算机运算
  • 计算机并不是像我们想象中的样子
  • 浮点数反复运算后,可能已经偏离我们的预期了,这些数值偏差进而导致沉船、坠机、发电站爆炸等。。。
  • 因此,如果在编码、设计程序算法、设计系统框架的过程中需要对细微数值差别进行反复计算,请大家无比多次校验运算结果!!!!

八、小结

这篇细节还是比较多的,多是从变量方面展开的。大致浏览一下,其实还不错哦。

猜你喜欢

转载自blog.csdn.net/weixin_43722052/article/details/110957934