什么叫实数

本文介绍C语言中实数的表示方法及其在内存中的存储形式,包括十进制小数形式和指数形式,并讨论不同精度实数的表示范围及精度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实数包括有理数无理数。其中无理数就是无限不循环小数(包括负数中的无限不循环小数),有理数包括整数(包含正整数、负整数和0)和分数(包括正分数和负分数)。数学上,实数直观地定义为和数轴上的点一一对应的数。本来实数仅称作,后来引入了虚数概念,原本的数称作“实数”意义是“实在的数”(任何实数都可在数轴上表示)。无理数就是平方开不尽的数


实型数据也称为浮点数或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。

实数的表示

1) 十进制数形式
由数码0~ 9和小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。

注意,必须有小数点。

2) 指数形式
由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为:
    a E n(a为十进制数,n为十进制整数)
其值为 a*10 n 。如:
2.1E5 (等于2.1*10 5 )
3.7E-2 (等于3.7*10 -2 )
0.5E7 (等于0.5*10 7 )
-2.8E-2 (等于-2.8*10 -2 )

以下不是合法的实数:
345 (无小数点)
E7 (阶码标志E之前无数字)
-5 (无阶码标志)
53.-E3 (负号位置不对)
2.7E  (无阶码)

【例3-5】输出实数。
   
  1. #include <stdio.h>
  2. int main(void){
  3. printf("%f\n ",356.);
  4. printf("%f\n ",356);
  5. printf("%f\n ",356.0);
  6. return 0;
  7. }
 3) 实数在内存中的存放形式
实数一般占4个字节(32位)内存空间。按指数形式存储。 实数3.14159在内存中的存放形式如下:


说明:
  • 小数部分占的位(bit)数愈多,数的有效数字愈多,精度愈高。
  • 指数部分占的位数愈多,则能表示的数值范围愈大。

实型变量

实型变量分为:单精度(float型)、双精度(double型)和长双精度(long double型)三类。

在VC6.0中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
类型说明符 比特数(字节数) 有效数字 数的范围
float32(4)6~710-37~1038         
double64(8)15~1610-307~10308
long double128(16)18~1910-4931~104932
 
实型变量定义的格式和书写规则与整型相同。例如:
   
  1. float x,y; // x,y为单精度实型量
  2. double a,b,c; // a,b,c为双精度实型量
实数的舍入误差
由于实数是由有限的存储单元组成的,因此能提供的有效数字总是有限的。 如下例。

【例3-6】实数的舍入误差。
   
  1. #include <stdio.h>
  2. int main(void){
  3. float a,b;
  4. a=123456.789e5;
  5. b=a+20;
  6. printf("a=%f\n",a);
  7. printf("b=%f\n",b);
  8. return 0;
  9. }
注意:1.0/3*3的结果并不等于1。

【例3-7】
   
  1. #include <stdio.h>
  2. int main(void){
  3. float a;
  4. double b;
  5. a=33333.33333;
  6. b=33333.33333333333333;
  7. printf("a=%f\nb=%f\n",a,b);
  8. return 0;
  9. }

从本例可以看出:
  • 由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。
  • b 是双精度型,有效位为十六位。但VC6.0规定小数后最多保留六位,其余部分四舍五入。

注意:实型常数不分单、双精度,都按双精度double型处理。
浮点数之所以被称为“浮点数”,是因为其**小数点位置可以“浮动”**,即通过科学计数法的表示方式动态调整小数点的位置,从而用固定数量的二进制位表示更大范围的数值。以下是详细解释: ### 1. **核心概念:科学计数法的二进制实现** - 浮点数采用类似科学计数法的形式存储数值,例如十进制的 `123.45` 可表示为 `1.2345 × 10²`。 - 在二进制中,浮点数通常表示为: **`(-1)^符号位 × 1.尾数 × 2^指数`** 其中: - **符号位**:表示正负(0为正,1为负)。 - **尾数(Mantissa)**:二进制小数部分(隐含整数部分为1,称为“规格化”形式)。 - **指数(Exponent)**:调整小数点位置的偏移量。 ### 2. **“浮点”的由来:小数点位置动态变化** - **固定点数的对比**: 早期计算机使用固定点数(如整数或小数点位置固定的实数),但范围和精度受限。例如,`00110010.1101` 的小数点位置固定,无法灵活表示极大或极小的数。 - **浮点数的优势**: 通过调整指数,小数点可以“浮动”到不同位置。例如: - 数值 `1.0` 可表示为 `1.0 × 2⁰`(指数为0,小数点在1后)。 - 数值 `0.125` 可表示为 `1.0 × 2⁻³`(指数为-3,小数点左移3位)。 - 数值 `2048.0` 可表示为 `1.0 × 2¹¹`(指数为11,小数点右移11位)。 ### 3. **IEEE 754标准:浮点数的具体实现** - Java的`float`和`double`遵循IEEE 754标准,其存储结构分为三部分: - **符号位**:1位(0为正,1为负)。 - **指数部分**:`float`用8位,`double`用11位(采用偏移码存储,如`float`的偏移量为127)。 - **尾数部分**:`float`用23位,`double`用52位(隐含前导1,实际精度为24位和53位)。 - **示例**: 十进制数 `-5.75` 的二进制表示为 `-1.0111 × 2²`,在IEEE 754中存储如下: - 符号位:`1`(负数) - 指数:`2 + 127 = 129`(`10000001`) - 尾数:`0111000...0`(补零至23位) ### 4. **为什么需要浮点数?** - **范围与精度的平衡**: 固定点数无法同时表示极大数(如天文距离)和极小数(如分子尺度),而浮点数通过动态调整小数点位置,用有限位数覆盖更大范围。 - **科学计算的需求**: 物理、工程等领域需要高精度或超大范围的数值,浮点数成为标准解决方案。 ### 示例代码 ```java public class FloatingPointExample { public static void main(String[] args) { float f = 5.75f; // 实际存储为 -1.0111 × 2² double d = 1.23e-10; // 科学计数法表示极小数 System.out.println("Float: " + f); // 输出 5.75 System.out.println("Double: " + d); // 输出 1.23E-10 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值