程序设计基础(C语言)(慕课版)电子刊物 您所在的位置:网站首页 c语言从1加到100等于多少 程序设计基础(C语言)(慕课版)电子刊物

程序设计基础(C语言)(慕课版)电子刊物

2023-04-22 11:46| 来源: 网络整理| 查看: 265

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 实验室设备网 版权所有