问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言中的float和double数据类型详解

创作时间:
作者:
@小白创作中心

C语言中的float和double数据类型详解

引用
1
来源
1.
https://www.geeksforgeeks.org/c-float-and-double/

在C语言中,float和double是两种用于存储浮点数的基本数据类型。它们的主要区别在于存储精度、内存占用和数值范围。本文将详细介绍这两种数据类型的特点、内存表示方式以及它们之间的差异。

Float

Float用于存储单精度浮点数,可以存储精度高达6-7位小数的十进制值。

语法

float var_name;
  • float类型的大小为4字节
  • 可以存储从3.4 x 10^-383.4 x 10^38的值。
  • 可以存储多达7位小数而不会丢失精度。
  • 对于float类型的格式说明符是%f

示例

// C Program to illustrate float
#include <stdio.h>
int main()
{
    // Syntax of declaring and initializing
    // the float variable
    float myVariable = 789.123456f;
    // printing floating point number
    printf("Float value is %f", myVariable);
    return 0;
}

输出

Float value is 789.123474

如上所示,由于float类型的位数限制,小数点后第7位之后的精度会丢失。在这种情况下,建议使用double类型。

注意:所有实数字面量默认为double类型。可以在数字末尾添加“f”来将其定义为float类型。

Double

Double用于存储双精度浮点值,是float的增强版本,可以存储精度高达15位小数的实数。

  • double类型的大小为8字节
  • 可以存储从1.7×10^-3081.7×10^+308的值。
  • 可以存储多达15位小数而不会丢失精度。
  • 对于double类型的格式说明符是%lf

示例

#include <stdio.h>
int main()
{
    // Syntax of declaring and initializing
    // the double variable
    double myVariable = 789.123456;
    printf("Double value is %lf", myVariable);
    //%lf or %f both can be used to
    // print Float values
    return 0;
}

输出

Double value is 789.123456

如何存储float和double?

C语言遵循IEEE 754标准在内存中表示浮点值。与int类型直接以二进制形式存储不同,float值被分为指数和尾数两部分存储。

根据IEEE 754标准,浮点值由三个组件组成:

  1. 符号位(Sign Bit):表示数字的符号。0表示正数,1表示负数。
  2. 偏置指数(Biased Exponent):由于指数可以是正数或负数,因此使用偏置指数,即在指数上添加一个偏置值。
  3. 归一化尾数(Normalized Mantissa):尾数是科学计数法中的精度位。

C float内存表示

float类型的大小为32位,其中:

  • 最高有效位(MSB)用于存储数字的符号。
  • 接下来的8位用于存储指数。
  • 剩余的23位用于存储尾数。

示例

假设要存储十进制数65.125:

转换为二进制形式,我们得到:
65     = 1000001
0.125  = 001
所以,
65.125 = 1000001.001
       = 1.000001001 x 10^6
归一化尾数 = 000001001
根据标准,
我们将通过将指数加127来获得偏置指数,
       = 127 + 6 = 133
偏置指数 = 10000101
符号位为0(正数)
因此,65.125的IEEE 754表示为:
0 10000101 00000100100000000000000

C double内存表示

double类型的大小为64位,其中:

  • 最高有效位(MSB)用于存储数字的符号。
  • 接下来的11位用于存储指数。
  • 剩余的52位用于存储尾数。

示例

以相同的数65.125为例:

从上面,
    65.5 = 1.000001001 x 10^6
归一化尾数 = 000001001
根据标准,偏置为1023。所以,
       = 1023 + 6 = 1029
偏置指数 = 10000000101
符号位为0(正数)
因此,65.125的IEEE 754表示为:
0 10000000101 0000010010000000000000000000000000000000000000000000

float和double之间的差异

特征
float
double
精度
单精度IEEE 754浮点数,提供7位小数的精度
双精度IEEE 754浮点数,提供15位小数的精度
内存使用
使用32位或4字节的内存
使用64位或8字节的内存
范围
可以存储从3.4 x 10^-38到3.4 x 10^+38的值
可以存储从1.7×10^-308到1.7×10^+308的值
格式说明符
%f是float的格式说明符
%lf是double的格式说明符
内存表示
符号位 = 1位
指数 = 8位
尾数 = 23位
符号位 = 1位
指数 = 11位
尾数 = 52位

结论

总结来说,C语言使用float和double来处理浮点数,但它们在精度、内存使用、范围和速度方面有所不同。当空间有限且精度可以妥协时,更适合使用float;而在空间不是问题的高精度应用中,则应使用double。选择合适的数据类型对于满足应用程序的需求至关重要。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号