浮点型详解

整型

数据类型所占字节表示范围
(singned)int4- 2 31 2^{31} 231 —— 2 31 2^{31} 231-1
(singned)short2- 2 15 2^{15} 215 —— 2 15 2^{15} 215-1
(singned)long4(64位为8字节)- 2 63 2^{63} 263 —— 2 63 2^{63} 263-1
unsigned int40—— 2 32 2^{32} 232-1
unsigned short20——65535
unsigned long4(64位为8字节)0—— 2 64 2^{64} 264-1

那么来看一下溢出的情况,以有符号位短整型为例(-32768——32767)

#include <stdio.h>
int main(){
    short i = 32767;
    short n = i+1;
    short m = i+2;
    printf("%d\n",n);
    printf("%d\n",m);
    return 0;
}
//运行结果
//-32768
//-32767

浮点型

数据类型位数有效数字
float326~7位
double6415~16位

我们通过float关键字或double关键字进行浮点型变量定义,float类型占据4个字节大小的内存空间,double占据8个字节的空间,与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式,指数也有符号位。

表示方法:1e-3 (e代表10的幂次,e后面必须是整数)

在这里插入图片描述

#include <stdio.h>
int main() {
	float i = 1.456;
	if (1.456==i) {
		printf("相等\n");
	}
	else {
		printf("不相等\n");
	}
	printf("%f\n", i);
	return 0;
}

在这里插入图片描述

原因:浮点数在存储的过程中将十进制的0.1456(*10)转换为二进制存储。不相等的原因就在存储转换的过程中,上图中指数部分存的是二进制,而二进制的幂指数, 2 1 2^1 21=2、 2 2 2^2 22=4、 2 3 2^3 23=8、 2 4 2^4 24=16、 2 5 2^5 25=32。没有哪一个2的指数为10,因而在将1.456(十进制)转换为浮点数的过程中,在内部存储的过程中取的是近似值。因而 i != 1.456 虽然输出结果是1.456000,但是结果取的是一个近似值!!!看下图的真实值

在这里插入图片描述

那么问题来了,如何判断浮点数相等?!
//用近似值判断!控制精度!
#include <stdio.h>
int main() {
	float i = 1.456;
	if (i-1.456>-0.000001&&i-1.456<0.000001) {
		printf("相等\n");
	}
	else {
		printf("不相等\n");
	}
	printf("%f\n", i);
	return 0;
}

我们知道float类型的有效数字位6~7位,指的是十进制的有效位,而不是上图中存储过程中的23位!!!

再来看一下,float类型中23位的小数部分,转换成十进制 2 23 2^{23} 223=8388608,是7位!但最高位是8!并不是9999999(7个9,最多6个9)所以float的有效位是6~7位!它指的是十进制的!!!

2 23 2^{23} 223=8388608,是7位!但最高位是8!并不是9999999(7个9,最多6个9)所以float的有效位是6~7位!它指的是十进制的!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值