实型数据详解

news2024/11/14 20:24:31

1 实型常量的表示方法

实数(real number)又称浮点数(floating-point number)。实数有两种表示形式:

(1)十进制小数形式。它由数字和小数点组成(注意必须有小数点)。.123、123.、123.0、0.0都是十进制小数形式。

(2)指数形式。如123e3或123E3都代表123x103。但注意字母e(或E)之前必须有数字,且e后面的指数必须为整数,如e3、2.1e3.5、.e3、e等都不是合法的指数形式。

一个实数可以有多种指数表示形式。例如123.456可以表示为123.456e0、12.3456e1、1.23456e2、0.123456e3、0.0123456e4、0.00123456e5等。把其中的1.23456e2称为“规范化的指数形式”,即在字母e(或 E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字。例如2.3478e2、3.0999E5、6.46832e12都属于规范化的指数形式,而12.908e10、0.4578e3、756e0则不属于规范化的指数形式。一个实数在用指数形式输出时,是按规范化的指数形式输出的。例如,指定将实数5689.65按指数形式输出,必然输出5.68965e+003,而不会是0.568965e+004或56.8965e+002。

2 实型变量

1.实型数据在内存中的存放形式

一个实型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分分别存放,小数部分采用规范化的指数方式表示。实数3.14159在内存中的存放形式如图3.7示意。

图中是用十进制数来示意的,实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分的。

在4个字节(32 位)中,究竟用多少位来表示小数部分,多少位来表示指数部分,标准C并无具体规定,由各C编译系统自定。不少C编译系统以24位表示小数部分(包括符号),以8位表示指数部分(包括指数的符号)。小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。

2.实型变量的分类

C实型变量分为单精度(float)型、双精度(double)型和长双精度(long double)型三类。有关规定见表3.2。

表3.2 实型数据

类型

比特数

有效数字

数值范围

float

32

6~7

-3.4x10-38--~3.4x1038

double

64

15~16

-1.7x10-308~1.7x10308

long double

128

18~19

-1.2x10-4932~1.2x104932

ANSIC并未具体规定每种类型数据的长度、精度和数值范围。有的系统将double型所增加的32位全用于存放小数部分,这样可以增加数值的有效位数,减少舍人误差。有的系统则将所增加的位(bit)用于存放指数部分,这样可以扩大数值的范围。表3.2列出的是微机上常用的C编译系统(如TurboC,MSC,BorlandC)的情况。应当了解,不同的系统会有差异。

对每一个实型变量都应在使用前加以定义。如:

float x,y; (指定x、y为单精度实数)

double z; (指定z为双精度实数)

long double t; (指定t为长双精度实数)

在初学阶段,对long double型用得较少,因此我们不准备作详细介绍。读者只要知道有此类型即可。

3.实型数据的舍入误差

由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。例如,a加20的结果显然应该比 a大。请分析下面的程序:

例3.4 实型数据的舍入误差。

main( )

{float a,b;

a=123456.789e5;

b=a+20;

printf("%f\n",b);

}

程序内 printf 函数中的“%f”是输出一个实数时的格式符。程序运行时,输出b的值与a相等。原因是:a的值比20大很多,a+20的理论值应是12345678920,而一个实型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。运行程序得到的a和b的值都是12345678848.000000,可以看到,前8位是准确的,后几位是不准确的,把20加在后几位上,是无意义的。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。与此类似,用程序计算1.0/3*3的结果并不等于1。

3 实型常量的类型

C编译系统将实型常量作为双精度来处理。例如已定义一个实型变量f,有如下语句:

f=2.45678*4523.65

系统将2.45678和 4523.65按双精度数据存储(占64位)和运算,得到一个双精度的乘积,然后取前7位赋给实型变量f。这样做可以保证计算结果更精确,但是运算速度降低了。可以在数的后面加字母f或F(如1.65f、654.87F),这样编译系统就会按单精度(32位)处理。

一个实型常量可以赋给一个float型、double 型或long double变量。根据变量的类型截取实型常量中相应的有效位数字。假如a已指定为单精度实型变量:

float a;

a=111111.111;

由于float 型变量只能接收7位有效数字,因此最后两位小数不起作用。如果a改为 double 型,则能全部接收上述9位数字并存储在变量a中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 热题 100 | 堆(一)

目录 1 什么是堆排序 1.1 什么是堆 1.2 如何构建堆 1.3 举例说明 2 215. 数组中的第 K 个最大元素 2.1 子树大根化 2.2 遍历所有子树 2.3 弹出栈顶元素 2.4 完整代码 菜鸟做题,语言是 C 1 什么是堆排序 1.1 什么是堆 堆的定义和分类&#xff…

打造新质生产力,亚信科技2024年如何行稳致远?

引言:不冒进、不激进,稳扎稳打, 一个行业一个行业地深度拓展。 【全球云观察 | 科技热点关注】 基于以往“一巩固、三发展”的多年业务战略,亚信科技正在落实向非通信行业、标准产品、软硬一体产品和国际市场的“四…

SpringBoot实战(二十七)集成WebFlux

目录 一、WebFlux1.1 定义1.2 WebFlux 与 Spring MVC 区别 二、代码实现2.1 Maven 配置2.2 暴露 RESTful API 接口的方式方式一:基于注解的控制器方式二:函数式路由器(Functional Endpoints) 2.3 测试Service2.4 测试ServiceImpl2…

c语言(动态内存管理函数)

1. 为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有: int arr[10] {0}; char a; 但是上述的开辟空间的⽅式有两个特点: 但是上述的开辟空间的⽅式有两个特点: • 空间开辟⼤⼩是固定的。 • 数组在申明的时候,必须指…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件,要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了,怎么办呢,可以先用个pe系统引导进去,再在PE系统里安装这个iso…

可观测性平台如何助推保险行业数智化转型与升级

近日,主题为“人工智能大模型应用与保险业信创建设”的华东地区保险业IT微沙龙在江西圆满落幕。活动汇聚了众多保险行业的信息技术领军人物,他们为行业的科技创新与转型发展提供了重要的思路与方向。博睿数据作为中国IT运维监控和可观测性领域领导者受邀…

AES,DES

AES加密过程 初始轮(Initial Round): 将明文分组与初始轮密钥(Round Key)进行XOR运算。轮运算(Rounds):AES算法中的加密运算是由多轮执行的,每一轮都包含四个基本步骤&…

LLaVA: Large Language and Vision Assistant 图片解析

LLaVA: Large Language and Vision Assistant 图片解析 目录 介绍 效果 ​编辑项目 测试代码 Form1.cs Helper.cs 下载 介绍 LLaVA,一种新的大型多模态模型,称为“大型语言和视觉助手”,旨在开发一种通用视觉助手,可以遵…

智慧矿山新趋势:大数据解决方案一览

1. 背景 随着信息技术的快速发展和矿山管理需求的日益迫切,智慧矿山作为一种创新的矿山管理方式应运而生。智慧矿山借助先进的信息技术,实现对矿山生产、管理、安全等各方面的智能化、高效化、协同化,是矿山行业转型升级的必然趋势。 欢迎关…

电子版合同的法律地位-复制品还是替代品?

电子合同与电子版合同并不完全等同,它们之间存在一些关键的区别。以下是对两者的专业解读: 电子合同 定义:电子合同是指完全以电子形式存在的合同,双方或多方通过电子设备进行协商、签署和履行。它不依赖于纸质文件,…

Java基于微信小程序的二手交易系统的实现(V2.0)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python 技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&#…

#Linux(文件系统概念)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)查看文件系统情况df,man df查看df命令的功能 (2)查看文件系统的类型 df-T (3)df …

前端开发经验分享:写页面时总是有预期之外的滚动条怎么办?

问题描述: 在制作一个页面时常常会出现一些预期之外的滚动条,一般有以下原因:1.内容过多:当容器内的内容(如文本、图片等)的总高度或总宽度超过容器的可视区域时,滚动条就会出现。2.样式设置&a…

Android Handler使用介绍

Android 中的 Handler 是用来和线程通信的重要工具。它主要用于在后台线程中执行任务,并将结果传递回主线程以更新用户界面。 一、基本概念 线程间通信: Android 应用通常具有主线程(也称为 UI 线程)和后台线程。Handler 允许您从…

有些商标名称慎加通用词,可能会以误认驳回!

近期看到一网友在30类方便食品申请"某某茶叶",这个商标名称部分商品通过一部分,另一部分商品以误认驳回,普推知产老杨分析时发现在以前很少出现这种情况,但是近年来商标名称加通用词误认驳回的比较多。 现阶段这种带通…

深度解析ThreadLocal:底层原理、数据隔离与内存泄漏解决

前言 这个问题算是我的一个羞耻点,起源于一次面试中,面试官问ThreadLocal的底层实现是啥,我那时候一直以为ThreadLocal是一个类似于Redis一样的独立于线程外的第三方存储容器,如何底层维护了一个Map结构,以线程ID为Key…

专题一——双指针算法

原理:将数组进行区间划分,通过指针(下标)的移动实现题目所要求的区间(数组分块) (实现代码统一是C) 建议在做题与看题解时要自己反复模拟这个实现的过程,以后在做题做到类似的题才能举一反三&am…

QT6实现创建与操作sqlite数据库及读取实例(一)

一.Qt为SQL数据库提供支持的基本模块(Qt SQL) Qt SQL的API分为不同层: 驱动层 SQL API层 用户接口层 1.驱动层 对于Qt 是基于C来实现的框架,该层主要包括QSqlDriver,QSqlDriverCreator,QSqlDriverCreatorBase,QSqlPlug…

Linux第78步_使用原子整型操作来实现“互斥访问”共享资源

使用原子操作来实现“互斥访问”LED灯设备,目的是每次只允许一个应用程序使用LED灯。 1、创建MyAtomicLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/”目录 输入“mkdir MyAtomicLED回车”,创建MyA…

Python从 Google 地图空气质量 API 获取空气污染数据

获取给定位置当前的空气质量 让我们开始吧!在本节中,我们将介绍如何使用 Google 地图获取给定位置的空气质量数据。您首先需要一个 API 密钥,可以通过您的 Google Cloud 帐户生成该密钥。他们有90 天的免费试用期,之后您将为您使用的 API 服务付费。在开始大量拨打电话之前…