第二章 数据类型、运算符与表达式(四)

本文详细介绍了C语言中的实型数据类型,包括浮点数的十进制和指数表示,以及单精度(float)和双精度(double)的区别。重点讲解了两者在内存占用、取值范围和精度上的差异,并通过示例说明了有效数字的概念和调试在程序开发中的重要性。
摘要由CSDN通过智能技术生成

二、C语言的数据类型

3、实型数据
实型数据简称实数,在 C 语言中称为浮点数(带小数部分的数)
1)实型常量的两种表示形式
(1)十进制数表示形式 0.12、3.14159
(2)指数表示形式:
在这里插入图片描述
指数表示形式不太常用,但要有所了解,其中字母E可以大写也可小写。

2)实型变量的分类
C 语言中,实型变量分为单精度和双精度两种类型。
(1)float:单精度变量
(2)double:双精度变量

3)实型变量的定义
在这里插入图片描述

上面两行代码有什么区别?float型变量一般在内存中占 4 字节, double 型变量一般在内存中占 8 字节,这意味着double 型变量所能保存的数据范围比float 型变量所能保存的数据范围大得多,并且精度高得多(精度后面会详细解释)

浮点数在内存中都是以指数形式存储的,所以能够存储的数据范围大到超乎想象
(1)单精度float: 取值范围为(1 .17549e-038) ~ (3.40282e+038)
(2)双精度 double:取值范围为 (2. 22507e-308)~ (1.7976ge+308)

如何区分float 和 double这两种浮点类型实数?它们的精度不同,float类型实数提供 7 位有效数字(考虑到四舍五入问题,保守算 6 位), double类型实数提供 15-16 位有效数字(考虑到四舍五入问题,保守算15 位),到底多少位有效数字 ,随机器系统而异。

有效数字是什么意思?如数字 12345.678,如果精度是 1 位有效数字,则实际只能存储为10000.0,也就是说,只能把最高位这个值存下,其余位全部都是0

如果精度是 2 位有效数字,则存储为 12000.0 ,也就是能存下最高的两位数值
如果精度是 3 位有效数字,则存储为 12300.0 ,也就是能存下最高的三位数值
如果精度是 7 位有效数字 ,则存储为 12345. 67X,X 表示该位置的数字值并不确定
再看看数字0.1234,如果精度是 1 位有效数字,则存储的可能为 0.1XXXXX,如果精度是2位有效数字,则存储的可能是 0.12XXXX,以此类推

4)调试
调试对于日后顺利进行程序开发非常作用,必须掌握好调试的方法。
在这里插入图片描述

注意观察结果abc实际结果为 111111 1. 13,而 cde 变量的实际结果为1111111.1100000001。
很明显, double 数据类型比 float数据类型的数据精度高很多,abc小数点后面从第 2 位开始就已经不是实际所赋的值了 ,而 cde 保存下了所赋值的全部有效位数。

例:
float 的精度是7位有效数字 ,下面的有效数是7位吗?
在这里插入图片描述

efg的值显示为1.23456794E+9,值展开后为 1234567940,与原数字1234567898.1234 比较,小数点左侧损失了3位,898变成了940,小数点后的4位1234全部丢失。

例:
在这里插入图片描述

受printf输出函数中的%f格式符所限,所以两条 printf语句输出结果都是 12. 345673,不同版本开发工具结果可能会略有差异。
在这里插入图片描述

aaa的值是12.34567260742187500000
bbb的值是12.34567291234987607140
上面的结果明显看到,double 数据类型比float数据类型精度高很多,因为double数据类型能保存的有效位数比float 数据类型多得多。

例:
在这里插入图片描述

通过断点,查看bb的值,为什么不是0.51,而是0.50999999?
当把一个十进制数值赋给一个实型变量时,计算机会把这个十进制数转换成二进制数保存,当程序执行流程,停在断点上,用鼠标查看这个变量值时,计算机实际上是把它保存的二进制数再转换成十进制数显示出来。
步骤是十进制 → 二进制 → 十进制,在这个过程中存在着一些除法运算,这些除法运算因无法整除的原因,会导致从二进制转换回十进制数时丢失精度。
例如日常生活中用10除以3,那么结果是3. 33333…,永远无法整除,是一样的道理。
受printf输出函数中的%f格式符所限,所以 printf语句输出bb的结果是0.510000。

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值