如何提高C语言代码质量?

Posted 嵌入式软件开发学习圈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提高C语言代码质量?相关的知识,希望对你有一定的参考价值。

关注“嵌入式软件学习圈”免费获取更多学习教程 

尽量少使用浮点类型

 C语言标准规定的浮点数据类型有floatdoublelong double三种,

如何提高C语言代码质量?(七)

和整型一样,浮点数据类型既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。因此,浮点数据类型的实现在各种平台上差异很大,有的处理器有浮点运算单元(Floating Point Unit, FPU),称为硬浮点(Hard-float) 实现而有的处理器没有浮点运算单元,只能做整数运算,也就是需要用整数运算来模拟浮点运算,这种实现方式称为软浮点( Soft-float)实现

迄今为止,大部分平台的浮点数实现都遵循IEEE754标准(IEEEStandardfor

Binary Floating-Point Arithmetic, ANSI/IEEE Std 754-1985 )这里需要特别说明的是,ANSIC并未规定long double类型的准确精度。正因为如此对于不同的平台,long double类型可能有不同的实现,有的是8字节,有的是10字节,还有的是12字节或更多。

x86平台上,大多数编译器实现的long double类型是80位,因为x86的浮点运算单元具有80位精度。如在VC++ 2010中运行“sizeof(long double)”所得的结果为8,而在GCC中运行“sizeof(long double)”所得的结果则为12 (96)。但一般来说,long double类型的精度要高于double类型,至少它们也应该相等。

 了解IEEE 754浮点数

浮点数简介

在计算机系统的发展过程中,业界曾经提出过许多种实数的表达方法,比较典型的有相对于浮点数( Floating Point Number)、定点数( Fixed Point Number)。在定点数表达法中,其小数点固定地位于实数所有数字中间的某个位置

例如,货币的表达就可以采用这种表达方式,如55.00或者00.55可以用于表达具有4位精度,小数点后有两位的货币值。由于小数点位置固定,所以可以直接用4位数值来表达相应的数值。

但我们不难发现,定点数表达法的缺点就在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。因此,最终绝大多数现代的计算机系统都采纳了所谓的浮点数表达法

浮点数表达法采用了科学计数法来表达实数,即用一个有效数字、一个基数( Base)、一个指数( Exponent) 以及一个表示正负的符号来表达实数。比如,666.66用十进制科学计数法可以表达为6.6666x 102 (其中,6.6666 为有效数字,10为基数,2为指数)。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

当然,对实数的浮点表示仅作如上的规定是不够的,因为同一实数的浮点表示还不是唯的。例如 上面例子中的666.66可以表达为0.66666x 1036.6666x 102或者66.666x 10'三种方式。因为这种表达的多样性,因此有必要对其加以规范化以达到统一表达的目标。范的浮点数表达方式具有如下形式:

有效数字中数字的个数称为精度,我们可以用p来表示,即可称为p位有效数字精度。每个数字d介于0和基数β之间,包括0

其中,对十进制的浮点数,即基数β等于10的浮点数而言,上面的表达式非常容易理解。12.34,我们可以根据上面的表达式表达为: 1 x 10^1+2x 10^0+3x 10^-1+4x 10^-2,其规范浮点数表达为1.234x 10'

但对二进制来说,上面的表达式同样可以简单地表达。唯不同之处在于:二进制的β等于2,而每个数字d只能在01之间取值。如二进制数1001.101,我们可以根据上面的表达式表达为: 1 x2^3+0x2^2+0x2^1+1 x2^0+1 x2^-1+0x2^-2+1 x2^-3,其规范浮点数表达为

1.001101 x 2^3

现在,我们就可以这样简单地把二进制转换为十进制,一个十进制小数要能用浮点数精确地表示,最后一位必须5(当然这是必要条件,并非充分条件)。规律推演如下面的示例所示:

如何提高C语言代码质量?(七)

 

 

之所以“34.6-34.0=0.599998",产生这个误差的原因是34.6无法精确地表达为相应的浮点数,而只能保存为经过舍人的近似值。而这个近似值与34.0之间的运算自然无法产生精确


如果你要将十进制数转换成二进制数,则需要把整数部分和小数部分分别转换。其中,整数部分除以2,取余数;小数部分乘以2,取整数位

如将13.125转换成二进制数如下:


首先转换整数部分(13),除以2,取余数,所得结果为1101

其次转换小数部分(0.125),乘以2,取整数位。转换过程如下:

0.125x2=0.25    取整数位0

0.25x2=0.5        取整数位0

0.5x2= 1            取整数位1

小数部分所得结果为001,

13.125=1101.001,用规范浮点数表达为1.101001 x2^3


如何提高C语言代码质量?历史消息








汽车电子入门历史消息

汽车电子控制技术入门(十) 主要讲述:ECU硬件软件的开发流程,以及控制过程包括:开环,闭环控制,链接为:


汽车电子控制技术入门(九) 主要讲述:氧传感器功用, 氧传感分类氧化锆(ZrO2)氧化钛(TiO2)氧化锆式氧传感器和氧化钛式氧传感器 工作原理,链接为:


汽车电子控制技术入门(八) 主要讲述:电子控制系统的组成、曲轴位置传感器工作原理、凸轮轴位置传感器(磁感式、霍尔式、光电式)工作原理,链接为:


汽车电子控制技术入门(七) 主要讲述:电动燃油泵、燃油分配管、燃油压力调节器、喷油器等组成以及其工作原理 链接为:


汽车电子控制技术入门(六) 主要讲述:燃油供给系统的组成、电动燃油泵的工作原理。链接为:


汽车电子控制技术入门(五) 主要讲述:温度传感器的组成分类,以及工作原理。链接为:


汽车电子控制技术入门(四) 主要讲述:空气式流量传感器的分类以及工作原理,节气门位置传感器的组成和工作原理。链接为:


汽车电子控制技术入门(三) 主要讲述:发动机电子控制系统,电子控制燃油喷射系统的分类和基本组成,空气供给系统的组成和工作原理。链接为:


汽车电子控制技术入门(二) 主要讲述:汽车电子控制技术的发展趋势,1、控制系统集成化,2、信息传输网络化,3、汽车和交通智能化,4、电控系统设计模块化,以及介绍了汽车电控系统的基本组成:传感器、执行器、ECU.链接为:


汽车电子控制技术入门(一) 主要讲述:汽车电子控制技术的发展,以及三个发展阶段:模拟电子电路阶段,微型计算控制阶段,车载局域网控制阶段。链接为:




 

 


以上是关于如何提高C语言代码质量?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高C语言代码质量?

如何提高C语言代码质量?

C语言编程代码好坏如何判断

静态函数库的制作和使用

每周一书-编写高质量代码:改善C程序代码的125个建议

如何保障Go语言基础代码质量?