3、浮点数

前言

狄泰软件唐老师的个人学习笔记

1、浮点数

浮点数在内存的存储方式:符号位,指数,尾数

类型符号位指数尾数
float1位(31)8位(23~30)23位(0~22)
double1位(63)11位(52~62)52位(0~51)
float 和 double 的表示方法相同,只是数值范围和精度不同

1.1浮点数的转换:

  1. 将浮点数转换为二进制
  2. 用科学计数法表示二进制浮点数
  3. 计算指数偏移后的值,偏移量与类型有关,float是127,double是1023

举例
实数 8.25 在内存中的 float 表示:

  • 8.25 的二进制表示:1000.01

  • 科学计数法表示为:1.00001* ( 2^3)

    • 符号位:0 (正数)
    • 指数:127(偏移量) + 3 = 130 = 1000 0010
    • 小数:00001
  • 因此,内存中 8.25 的 float 表示为:
    0(符号位) 1000 0010(指数) 0000 1000 0000 0000 0000 000 (小数) = 0x4104 0000

实验:8.25在内存中的表示

#include <stdio.h>

int main()
{
	float i = 8.25;
    unsigned int* p = (unsigned int*)(&i);
	
	printf("0x%X\n", *p);
	return 0;
}

2、int 与 float 的范围问题

在这里插入图片描述

int 和 float 都占四个字节,为啥float的范围更大?
  1. float 能表示的具体数字的个数与 int 相同
  2. 因此,float 是不连续的,存在间隙,(相邻内存之间不连续,小数是无穷的,连续了,内存多少也不够啊)
  3. 因此,float是一种近似的表示法,不够精确
  4. 由于内存表示法相对复杂,float 的运算速度比 int 慢很多
  5. double 与 float 具有相同的内存表示法,因此double也不精确,而double 的内存更多,相比较而言,double 更精确

实验:验证 float 的不精确

#include <stdio.h>

int main()
{
	float i = 3.1415;
    float a = 123456789;
	
	printf("%0.10f\n", i);	//3.1414999962
	printf("%0.10f\n", a);	//123456792.0000000000
	return 0;
}

注:float 的不精确性导致了他不能直接与 0 直接比较

float f = 0.0;
if(f == 0)
{
}

这个判断条件可能永远为假,float是不精确的表示,可能初始化为0,但是内存不是0,直接等于0 ,可能永远不成立,if 内的条件可以是一个范围

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值