程序设计基础(C语言)(慕课版)电子刊物 | 您所在的位置:网站首页 › c语言从1加到100等于多少 › 程序设计基础(C语言)(慕课版)电子刊物 |
42程序设计基础 ( C语言)(慕课版) 3 4 5 6 7 8 { unsigned short a = 8; unsigned short b = 10; printf(\"%hu\ \", a - b); //无符号数做减法时产生了数值溢出 return 0; } 程序的运行结果如下: 65534 这个例子说明,做无符号整数减法时,如果被减数小于减数,也会发生溢出。因此,做无 符号整数减法时必须要保证被减数大于或等于减数,否则就会因借位借到最高位而使得符号位 由0变成1而发生溢出,从而得到一个比较大的正数。正因如此,在程序中比较a和b的值时,不 能随意用a – b < 0取代a < b,因为前者有可能产生溢出。 与整数不同的是,浮点数不仅会发生上溢出,还会发生下溢出。当运算结果的绝对值小于 计算机能表示的最小数的绝对值时,发生下溢出,系统会将该运算结果处理成机器零。 数值溢出的危害在于编译器有可能对它熟视无睹,不会检查这种错误。1996年阿丽亚娜5型 运载火箭发射失败就是因浮点数转换成整数发生溢出而导致的。 为了防止数值溢出,选择恰当的数据类型,在程序设计之前必须对问题中的数据规模及 类型的上下界有所了解。每种类型都定义了其所能表示的数的上限值和下限值。例如,浮点数 的上限值、下限值和有效位数是在float.h头文件中定义的,宏名DBL_MAX和DBL_MIN分别表 示double型浮点数的上限值和下限值,而DBL_DIG则表示其有效位数。整数的上限值(INT_ MAX)和下限值(INT_MIN)是在limits.h头文件中定义的。 2.关于精度损失问题 当数据从高精度的类型向低精度的类型转换时,往往会出现精度损失。 因低精度类型在内存中所占的数值位数比高精度类型少,容纳不下高精度类 型数据的所有信息,所以会出现数据的丢失。例如,浮点型转为整型,会丢 失小数部分,某些情况下还会损失整数部分的精度。 那么,如何衡量浮点数的表数精度呢?对于一个十进制的浮点数,从左边第一个不是0的 数字起,到精确到的位数为止,其间的所有数字称为这个数的有效数字(Significant Digit)。 有效数字位数常用于表示一个浮点数的精度,这个精度和浮点数的尾数在内存中所占的位数相 关。不同的C编译系统分配给阶码和尾数的内存字节数是不同的。那么,单精度浮点型和双精度 浮点型究竟能表示多少位有效数字呢? 我们知道,十进制小数在内存中是以二进制小数形式存储的。然而,二进制小数与十进制 小数之间并不是一一对应的关系,一个二进制小数一定对应一个十进制小数,而一个十进制小 数却不一定有一个二进制小数与之对应,有时只能用一个值相近的二进制小数来近似表示某个 十进制小数。例如,使用二进制所能表示的两个最小的单精度小数2-23与2-22分别对应的十进制小 数并不是连续的,二者之间存在一定的间隔,这使得尾数在内存中仅占23位的单精度浮点型只 能精确表示6~7位,即有6~7位有效数字,而尾数在内存中占52位的双精度浮点型的有效数字 位数可以提高到16位。 例如,将浮点数1234567890.0赋值给一个单精度浮点型变量时,会因单精度浮点型表示精 度有限而产生舍入误差,使得该变量实际得到的值不是1234567890.0,而是1234567936.0。这是 因为单精度浮点型只有6~7位有效数字,有效数字后的数字都是不准确的。 再如,假设将两个不同的浮点数9.87654321和9.87654322分别赋值给单精度浮点型变量a和 b,实际上在内存中存储的a和b的二进制小数都是0x411E0652,如果此时判断a与b是否相等,那 么一定会得出a和b相等的结论,这是因为受表示精度的限制,单精度浮点型无法区分出这两个 精度损失问题 |
CopyRight 2018-2019 实验室设备网 版权所有 |