C语言圣经学习心得 1.2.3 浮点型变量

浮点型(float和double)

一、定义

浮点型变量是一种用于表示带有小数点的数值的数据类型。C语言中有两种主要的浮点型数据类型:float(单精度浮点数)和double(双精度浮点数)。单精度浮点数使用32位存储,而双精度浮点数使用64位存储,因此双精度浮点数的精度更高。

浮点数定义示例:

float temperature = 98.6;    // 初始化一个单精度浮点型变量

double pi = 3.14159265359;   // 初始化一个双精度浮点型变量

二、格式

浮点数在计算机内部以一种特殊的二进制格式进行表示,这个格式遵循IEEE 754标准。

IEEE 754单精度浮点数的格式包括:

1位符号位:用于表示数的正负;

8位指数部分:用于表示指数,采用偏移二进制表示;

23位尾数部分:用于存储小数的有效位数。

IEEE 754双精度浮点数的格式包含1位符号位、11位指数、52位尾数。

虽然我们通常以十进制方式书写浮点数,但计算机必须将它们转换为二进制形式来进行存储和计算,这个过程可能会导致一些精度损失,特别是对于那些无限循环的十进制小数。

Tips:

在计算机内部,浮点数的位数是有限的,所以只能表示一个近似的值,这是浮点数精度问题的根本原因。这就是为什么在使用浮点数进行精确计算时需要格外小心,比如应谨慎使用==运算符,保险起见,最好使用一个小的容忍度来比较两个浮点数,例如:

if ( fabs( a – b ) < 0.0001 ) {

       prinft(“a = b”);

 } // 浮点数a 和 b 的差值在容忍度内即可算作相等

三、示例

书中有一个浮点数运算的例子,参考数学公式℃=(5/9)(℉-32)打印华氏温度与摄氏温度对照表:

Tips:

  1. 如果使用整数计算5/9,结果只能为0,因此需要使用浮点数计算。在整数后加小数点5.0/9.0,即可可将其转为浮点数类型。为实现精度,代码中公式需改成celsius = (5.0/9.0) * (fahr-32.0); 来实现计算出不被舍位的浮点数结果。
  2. 如果某个表达式中有一个浮点数和一个整数,则在开始运算之前整数将会被转换为浮点型。例如,在表达式 fahr – 32 中,32将被自动转换为浮点数再参与运算。不过写代码时最好还是为它加上一个显式小数点(fahr-32.0),强调其浮点性质,便于阅读。
  3. printf 格式打印可以设置宽度与精度,使打印结果更整洁美观。例如:

%6d 按照十进制整型数打印,至少 6 个字符宽

%f 则仅仅要求按照浮点数打印该数。

%6f 表示待打印的浮点数至少有 6 个字符宽;

%.2f 指定待打印的浮点数的小数点后有两位小数,但宽度没有限制;

%6.2f 按照浮点数打印,至少 6 个字符宽,小数点后有两位小数

%3.0f 表明待打印的浮点数至少占 3 个字符宽,且不带小数点和小数部分

拓展知识:

关于浮点数精度问题,举个例子,将0.1这个十进制数转换为二进制表示的步骤:

  1. 第一步,在IEEE 754标准中,它将近似地表示为一个无限循环的二进制小数,具体如下:

将0.1转换为二进制小数的规则是将小数部分不断乘以2,并记录每次乘法的整数部分。

第一次乘以2:0.1 * 2 = 0.2,整数部分为0,小数部分为0.2。

第二次乘以2:0.2 * 2 = 0.4,整数部分为0,小数部分为0.4。

第三次乘以2:0.4 * 2 = 0.8,整数部分为0,小数部分为0.8。

第四次乘以2:0.8 * 2 = 1.6,整数部分为1,小数部分为0.6。

第五次乘以2:0.6 * 2 = 1.2,整数部分为1,小数部分为0.2。

第六次乘以2:0.2 * 2 = 0.4,整数部分为0,小数部分为0.4。

……

这个过程可以一直继续下去,得到0.0001100110011...的无限循环二进制小数。

  1. 第二步,在IEEE 754中,浮点数采用科学计数法的形式表示,即乘以2的幂次。为了标准化0.0001100110011...,我们需要将小数点向右移动,使得只有一个非零位数。0.0001100110011... 可以标准化为 1.100110011... × 2^(-4),这里我们将小数点向右移动了4位,所以指数为-4。
  2. 第三步,表示指数部分:IEEE 754标准要求将指数部分表示为偏移值(offset value)。对于双精度浮点数,指数占11位。偏移值通常是2^(k-1) - 1,其中k是指数的位数,所以双精度浮点数偏移值为2^(11-1) - 1 = 1023。
  3. 第四步,表示尾数部分:标准化小数点后的二进制数字。在IEEE 754中,尾数占52位。
  4. 第五步:将符号位、指数部分、和尾数部分组合起来,得到完整的IEEE 754双精度浮点数表示:最终的二进制表示为:0(1bit符号) 1111111011(11bit指数) 1001100110011001100110011001100110011001100110011...(52bit尾数),共64位,即双精度浮点数的位数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值