C++系列-第1章顺序结构-7-浮点型

在这里插入图片描述

在线练习:
http://noi.openjudge.cn/
https://www.luogu.com.cn/

总结

本文是C++系列博客,主要讲述浮点型的用法

浮点型

1、常量
圆周率是一个常数。计算机程序设计中有一个类似的概念是“常量”。C++语言规定,一个常量可以直接调用(如 124、3.14 等),也可以给常量取个名字用一个标识符代表它,这就是符号常量。其语法格式为:
const 类型符号常量=常量字串例如: const double PI=3.14;
习惯上,符号常量名用大写,而变量名用小写,以便于区别。使用符号常量的一般还有一下两个好处:

增加了程序的可读性。如见到 PI 就可知道它代表圆周率,定义符号常量名时应该尽量使用见名知意的常量名。
增加了程序的易改性。如程序中,只需改动一处,程序中的所有 PI都会自动全部代换,做到“一改全改”

2.实型
C++语言支持三种实型,它们是 float(单精度实型)、double(双精度实型)long double(长双精度实型)。float 在空间允许的情况下没有必要使用,都应使用 double 提高精度。

3.保留小数
如果直接使用 cout<<进行浮点数的输出,C++默认的流输出数值有效位是 6位,我们可以使用 setprecision ()来改变有效位个数。例如,

#include <iostream>
#include <iomanip>
using namespace std; 
int main() {
    cout<<setprecision(3)<<3.1415926;
    cout<<setprecision(3)<<31.415926;
}

将输出的结果为 3.14
在实际的题目中,往往需要保留小数,而不知道整数部分的长度,我们可以将 fixed 和 setprecision ()合用,以保留小数点后有效数字的位数。
例如,

#include <iostream>
#include <iomanip>
using namespace std; 
int main() {
    cout<<setprecision(3)<<3.1415926<<endl;
    cout<<setprecision(3)<<31.415926<<endl;
    cout<<fixed<<setprecision(3)<<31.415926;
}

将输出的结果也为
在这里插入图片描述

整型的大小

参考:C/C++之最值limits.h(climits)和limits头文件
在limits.h/climits中,定义了INT_MAX,INT_MIN,可以直接使用
INT_MAX = 2^31-1,INT_MIN= -2^31,分别表示最大整数和最小整数。

占的位数

32位编译系统:int占四字节,与long相同。long int和int是一回事
64位编译系统:int占四字节,long占8字节,long数据范围变为:-2^63 ~ 2^63-1
注意,long long在任何平台和编译器上都已经被定义为占8个字节。


#include <iostream>
#include <climits>				//limits.h
using namespace std;

int main() {
	cout << "sizeof(char)"		<< sizeof(char) << endl;
	cout << "sizeof(int) "		<< sizeof(int) << endl;
	cout << "sizeof(long) "		<< sizeof(long) << endl;
	cout << "sizeof(double)  "		<< sizeof(double) << endl;
	cout << "sizeof(float)  "		<< sizeof(float) << endl;

	/*
	sizeof(char)1
	sizeof(int) 4
	sizeof(long) 4
	sizeof(double)  8
	sizeof(float)  4
	*/
	return 0;
}

输出为:
在这里插入图片描述

最大值

#include <iostream>
#include <climits>		//limits.h
using namespace std;

int main() {
	cout << "char: "		<< CHAR_MAX << endl;
	cout << "short: "		<< SHRT_MAX << endl;
	cout << "int: "			<< INT_MAX << endl;
	cout << "long: "		<< LONG_MAX << endl;
	cout << "long long: "	<< LLONG_MAX << endl;
	/*
	char: 127
	short: 32767
	int: 2147483647
	long: 2147483647
	long long: 9223372036854775807
	*/
	return 0;
}

输出为:
在这里插入图片描述

最小值

#include <iostream>
#include <climits>				//limits.h
using namespace std;

int main() {
	cout << "char: "		<< CHAR_MIN << endl;
	cout << "short: "		<< SHRT_MIN << endl;
	cout << "int: "			<< INT_MIN << endl;
	cout << "long: "		<< LONG_MIN << endl;
	cout << "long long: "	<< LLONG_MIN << endl;
	/*
	char: -128
	short: -32768
	int: -2147483648
	long: -2147483648
	long long: -9223372036854775808
	*/
	return 0;
}

输出为:
在这里插入图片描述

带符号与无符号

#include <iostream>
#include <climits>				//limits.h
using namespace std;

int main() {
	cout << "signed char_max: "		<< SCHAR_MAX << endl;
	cout << "signed char_min: "		<< SCHAR_MIN << endl;
	cout << "unsigned char: "		<< UCHAR_MAX << endl;
	cout << "unsigned short: "		<< USHRT_MAX << endl;
	cout << "unsigned int: "		<< UINT_MAX << endl;
	cout << "unsigned long: "		<< ULONG_MAX << endl;
	cout << "unsigned long long: "	<< ULLONG_MAX << endl;
	/*
	signed char_max: 127
	signed char_min: -128
	unsigned char: 255
	unsigned short: 65535
	unsigned int: 4294967295
	unsigned long: 4294967295
	unsigned long long: 18446744073709551615
	*/
	return 0;
}

在这里插入图片描述

int 计算机中占4个字节,32位,是有符号数,long long ,占8个字节,64位。

浮点型的大小

在C++中,浮点型数值的范围大小取决于所使用的数据类型,以及计算机系统中的浮点数标准。C++定义了三种浮点类型:floatdoublelong double。这些类型分别对应着不同位数的存储空间,从而影响着数值的范围和精度。

占的位数

32位编译系统:int占四字节,与long相同。long int和int是一回事
64位编译系统:int占四字节,long占8字节,long数据范围变为:-2^63 ~ 2^63-1
注意,long long在任何平台和编译器上都已经被定义为占8个字节。


#include <iostream>
#include <climits>				//limits.h
using namespace std;

int main() {
	cout << "sizeof(char)"		<< sizeof(char) << endl;
	cout << "sizeof(int) "		<< sizeof(int) << endl;
	cout << "sizeof(long) "		<< sizeof(long) << endl;
	cout << "sizeof(double)  "		<< sizeof(double) << endl;
	cout << "sizeof(float)  "		<< sizeof(float) << endl;

	/*
	sizeof(char)1
	sizeof(int) 4
	sizeof(long) 4
	sizeof(double)  8
	sizeof(float)  4
	*/
	return 0;
}

输出为:
在这里插入图片描述

float:单精度浮点型

  1. float:单精度浮点型,通常占用32位内存,遵循IEEE 754标准。它可以表示的数值范围大约在3.40282347E+38到1.17549E-38之间。这个范围内包括了正数、负数、零、无穷大和非数值(NaN,Not a Number)。
    案例演示:
#include <iostream>
#include<limits>

using namespace std;
int main() {
    float f = 1.23456789F;
    cout << "The value of f is: " << f << endl;
    cout << "The range of float is: " << numeric_limits<float>::max() << " to " << numeric_limits<float>::min() << endl;
    return 0;
}

输出为:
在这里插入图片描述

在这个例子中,f 被初始化为一个单精度浮点数,limits 头文件提供了关于浮点类型的最大值和最小值的信息。

double:双精度浮点型

  1. double:双精度浮点型,通常占用64位内存。双精度浮点数的范围大约在1.79769313486231570E+308到2.2250738585072014E-308之间。
    案例演示:
#include <iostream>
#include<limits>

using namespace std;
int main() {
    double d = 1.23456789;
    cout << "The value of f is: " << d << endl;
    cout << "The range of float is: " << numeric_limits<double>::max() << " to " << numeric_limits<double>::min() << endl;
    return 0;
}

输出为:
在这里插入图片描述

在这个例子中,d 被初始化为一个双精度浮点数。

long double:长双精度浮点型

  1. long double:长双精度浮点型,占用大于64位的内存,具体大小取决于编译器和系统。它的范围通常比double类型更广。
    案例演示:
#include <iostream>
#include<limits>

using namespace std;
int main() {
    long double ld = 1.23456789L;
    cout << "The value of f is: " << ld << endl;
    cout << "The range of float is: " << numeric_limits<long double>::max() << " to " << numeric_limits<long double>::min() << endl;
    return 0;
}

输出为:
在这里插入图片描述

应注意的是,long double 的具体存储大小和范围可能因平台和编译器而异,所以上面的代码仅提供一个示例。
浮点数的表示方式遵循IEEE 754标准,该标准定义了浮点数的存储格式,包括符号位、指数位和尾数位。在C++中,浮点数的范围和精度受这些标准规则的限制,同时也受到编译器和平台的影响。

浮点数的精度计算

开门见山

float范围:
最小负数-2*2^127
最大负数-1*2^(-126),0
最小正数 1*2^(-126)
最大正数2*2^(127)。

double范围:
负数:(-1.7976931348623157E+308,-4.94065645841246544E-324);
零:0 ;
正数:(4.94065645841246544E-324,1.7976931348623157E+308)。
即绝对值为0和2^1022——2^1024。

精度:

float和double的精度是由尾数的位数来决定的;
浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响;
float:2^23 =8388608,共七位,意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

原因

float:1bit(符号位)+8bits(指数位)+23bits(尾数位);
double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)。
以float为例,阶码(指数)用移码来表示,8位移码(偏移量为127) 本来应该可以表示-128-127,但是全0和全1被用来 表示特殊状态的指数 ,所以为-126-127(无符号8位表示0-255,去除全0和1后是1-254,减去偏移量127,就是-126-127)。 这里为什么要使用127来作为偏移量,若使用128 则8位移码表示范围-127~126,由于表示一个大的正数 比一个小的负数更加重要,所以127作为偏移量比较合适。
现在可以计算其表示范围了:
尾数部分的取值范围[1,2),所以最
小负数-2*2^127
最大负数-1*2^(-126)
最小正数 1*2^(-126)
最大正数2*2^(127)

float类型为例,我们可以根据IEEE 754标准来计算其最大数值和最大精度。

最大数值

float类型的最大数值是由其表示的精度和存储空间决定的。对于32位的float类型,其最大数值是:

  • 符号位:1位
  • 指数位:8位
  • 尾数位:23位
    根据IEEE 754标准,float类型的指数位采用偏移表示法,即实际的指数值是存储的指数值减去一个偏移量。对于float类型,这个偏移量是127。因此,最大的指数值为2^8 - 1 = 255,但由于偏移量是127,所以实际的指数范围是从-126到127。
    对于最大数值,我们考虑最大的正指数(即指数为127),并且尾数位全为1的情况。这种情况下,最大数值为:
(-1)^0 * 2^(127 - 127) * 1.1111111...1111111

由于指数为0,这个数值实际上是1.1111111…1111111(23个1)乘以2的0次方,即1。但是,由于IEEE 754标准中有一个隐藏的1,实际上这个最大数值是:

(-1)^0 * 2^(127 - 127) * 1.1111111...1111111 * 2^(-23)

这个隐藏的1是用来保证浮点数的表示不会比实际的整数小,同时也是IEEE 754标准中规定的一部分。因此,最大数值实际上是:

1 + 2^(-23)

这个数值是float类型的最大正数值,其值为3.40282347E+38。

最大精度

最大精度是指float类型能够表示的最小的数值变化。由于float类型的尾数位有23位,因此最大精度是2的-23次方,即:

2^(-23)

这个数值是非常小的,表示float类型能够表示的精度非常高。例如,如果有一个float变量存储了一个数值,那么这个数值的实际值可以在其基础上加上或减去最大精度而不改变可观察到的值。
综上所述,float类型的最大数值是3.40282347E+38,最大精度是2的-23次方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313576.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux后台进程的总结

文章目录 方案1 nohup &方案2 screen 方案1 nohup & 1、单独使用 nohup 执行脚本&#xff0c;如下图所示&#xff0c;终端会被接管&#xff0c;就是标准输入stdin 被关闭了&#xff0c;使用ctrlc会导致终止执行&#xff0c;但是可以关闭这个终端&#xff0c;重新打开终…

GVM垃圾收集算法

分代收集理论 目前主流JVM虚拟机中的垃圾收集器&#xff0c;都遵循分代收集理论&#xff1a; 弱分代&#xff1a;绝大多数对象都是朝生夕灭强分带&#xff1a;经历越多次垃圾收集过程的对象&#xff0c;越难以回收&#xff0c;难以消亡 按照分代收集理论设计的“分代垃圾收集…

挑选全身动作捕捉设备需要看哪几点?

随着数字化发展&#xff0c;虚拟数字人成为企业、品牌营销中不可或缺的一环&#xff0c;虚拟数字人可以通过全身动作捕捉设备&#xff0c;能够打破次元壁与用户实时互动。那要怎么挑选全身动作捕捉设备呢&#xff1f; 广州虚拟动力推出了旗舰版惯性动捕设备DreamsCap X1&#…

洗地机是智商税吗?2024洗地机品牌推荐

为了更加便捷地应对家务&#xff0c;人们一直在不断发明各种工具。从最早的扫把和拖布&#xff0c;到后来的吸尘器和扫地机器人&#xff0c;我们的家务清洁方式不断演进。然而&#xff0c;在最近几年&#xff0c;洗地机的出现彻底改变了我们的家庭清洁体验&#xff0c;为我们带…

微服务自动化docker-compose

一、docker-compose介绍 Docker Compose是一个用来定义和运行多个复杂应用的Docker编排工具。例如&#xff0c;一个使用Docker容器的微服务项目&#xff0c;通常由多个容器应用组成。那么部署时如何快速启动各个微服务呢&#xff0c;一个个手动启动&#xff1f;假如有上百个微服…

安卓(雷电)模拟器清除屏幕密码[亲测可用]

1、设置磁盘可写 启动模拟器&#xff0c;然后在模拟器的设置界面&#xff0c;设置磁盘共享为可写入&#xff0c;重启模拟器&#xff0c;如下图&#xff1a; 2、找到模拟器目录 返回桌面&#xff0c;右键模拟器图标&#xff0c;打开文件所在目录&#xff0c;如下图&#xff1a…

一天一个设计模式---适配器模式

概念 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作&#xff0c;使得原本由于接口不匹配而无法合作的类能够一起工作。 具体内容 适配器模式主要包括以下几个要素&#xff1a; 目标接…

Maven_下载_安装_配置

文章参考&#xff1a;https://zhuanlan.zhihu.com/p/615382243 Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 maven优点&#xff1a;…

呼吸道病毒感染后,为何会引发细菌性肺炎?气道和肠道微生物组改变是关键

谷禾健康 病毒-细菌合并或继发感染 引起呼吸道感染的病毒是导致全世界高发病率和死亡率的原因&#xff0c;数十年来通常发生在冬季。在冬天&#xff0c;空气干燥&#xff0c;那些可能含有病毒的飞沫可以在空气中停留更长时间&#xff0c;并可以进一步传播。此外人的免疫力在冬季…

[Markdown] Markdown常用快捷键分类汇总

文章目录 Markdown1、标题2、列表3、强调4、链接和图片5、代码和公式6、表格和任务列表7、引用8、分割线9、脚注10、目录11、注释12、定义 Markdown Markdown是一种轻量级的标记语言&#xff0c;可以让你用简单的语法来编写格式丰富的文档。 Markdown编辑器是一种专门用于编辑…

连接打印机显示“0x0000011b”错误代码,亲测有效的解决办法

程序代码园发文地址&#xff1a;null小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,连接打印机显示“0x0000011b”错误代码&#xff0c;亲测有效的解决办法http://www.byqws.com/blog/2142.html 最近办公室共享打印机突然打印不了&#xff0c;把之前连接的打印…

数字图像线性滤波——方框、均值、高斯滤波及opencv(C++)实现示例

数字图像线性滤波——方框、均值、高斯滤波及opencv&#xff08;C&#xff09;实现示例 一、图像滤波概念简介二、方框滤波及opencv实现示例1、方框滤波的公式2、opencv方框滤波boxfilter()函数&#xff08;1&#xff09;函数介绍&#xff08;2&#xff09;opencv实现实例&…

怎样创建vue项目(分别基于vue-cli和vite两种的创建方式)

一、基于vue-cli脚手架创建 1、安装node.js 1、首先需要安装node.js&#xff0c;推荐下载地址&#xff1a;Node.js 2、检查是否安装成功&#xff0c;使用打开黑窗口的快捷键windowR&#xff0c;输入cmd&#xff0c;在黑窗口输入node -v&#xff0c;如果输出版本号&#xff0…

LeNet-5(用于手写体字符识别)

结构&#xff1a;输入的二维图像&#xff0c;先经过两次卷积层到池化层&#xff0c;再经过全连接层&#xff0c;最后使用softmax分类作为输出层 每层有多个Feature Map&#xff08;每个Feature Map有多个神经元&#xff09; Feature Map通过一种卷积滤波器提取输入的一种特征 …

19. 从零用Rust编写正反向代理, 配置数据的热更新原理及实现

wmproxy wmproxy是由Rust编写&#xff0c;已实现http/https代理&#xff0c;socks5代理&#xff0c; 反向代理&#xff0c;静态文件服务器&#xff0c;内网穿透&#xff0c;配置热更新等&#xff0c; 后续将实现websocket代理等&#xff0c;同时会将实现过程分享出来&#xff…

vue3.2引用unplugin-vue-components插入,解放开发中import组件

目录 前言引用unplugin-vue-components插件的优缺点优点缺点 unplugin-vue-components插件引入安装插件配置vite配置更新TypeScript配置使用代码位置 总结Q&A 前言 unplugin-vue-components是一个用于Vue.js项目的插件&#xff0c;特别适用于Vite和Webpack构建工具。它的主…

区块链是怎么存储数据的?

每个块都是有大小限制的新的数据存储单元&#xff0c;当前数据不到上限&#xff0c;那么都可以添加进块。当前数据达到了上限&#xff0c;那么就得分表/分块&#xff0c;超限的那部分数据就需要等待下个区块存储 存储的数据&#xff1a;和mysql一样&#xff0c;文本数据直接存储…

【ceph】在虚拟环境中需要给osd所在的虚拟盘扩容操作

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

CAD点划线如何绘制?

CAD作为一款专业的制图软件&#xff0c;应用范围非常广泛&#xff0c;在所有需要精准数据的行业都会用到它。其中&#xff0c;公路交通工程等行业应用CAD软件是最多的&#xff0c;而且在这些行业中CAD软件中的线段应用也是最广泛的&#xff0c;其中的点划线在公路设计中用的是最…