1、先给出实型变量取值范围

实型变量可以分为单精度(float)(4字节)、双精度(double)(8字节)、长双精度(long double)(8字节)三种类型。

在 VC6.0 double和long double型具有完全相同的长度和存储格式,它们是等同的,但其它编译器可能不同。

下面给出实型变量取值范围:



java float可以赋值给double吗_python

2、实型变量在C语言内存中的存放形式

首先在讨论这个问题之前,先给出实型变量在C语言内存中的存放形式:

在存储实型数据时,无论表示是小数还是指数,均以指数格式存储,即实数的存储由符号位、指数、以及尾数等三部分组成。

下面我就将标准值是怎么定义的,和你说一下:

这个比较复杂,建议你找一下IEEE754标准看一下。



java float可以赋值给double吗_数据分析_02


其中,s 表示 sign,即符号。如果 s == 0,则浮点数 V 为正;如果 s == 1,则浮点数 V 为负。


M 表示有效数字,在 [1, 2) 之间。

而 E 则是指数位。

故float存储的数字可以写成:



java float可以赋值给double吗_数据分析_03

(1)Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。


(2)Exponent(8位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。

(3)Mantissa(23位):尾数部分。也就是上文中提到的数字b。



java float可以赋值给double吗_机器学习_04


举个例子:计算float 13.14在C语言内存中存储情况


(1)首先整数用二进制表示为1101

(2)0.14用二进制表示为:

0.14x2=0.28      整数部分  0

0.28x2=0.56      整数部分  0

0.56x2=1.12      整数部分  1

0.12x2=0.24      整数部分  0

0.24x2=0.48      整数部分  0

0.48x2=0.96      整数部分  0

0.96x2=1.92      整数部分  1

0.92x2=1.84      整数部分  1

0.84x2=1.68      整数部分  1

这怎么还不出来结果呢,无奈。。。。。。(由于涉及后面循环了,所以临时更改一个例子,机智)

emmmmm,对的,这个例子不算了,下面来看下一个例子:

举个例子:计算float 2.5在C语言内存中存储情况

(1)整数部分可以写成二进制:0010

(2)小数部分0.5可以写成二进制如下:0.1

0.5x2=1     整数部分 1

(3)故2.5用二进制表示为10.1,然后可以写成类似于科学计数法:1.01x2^1

(4)根据上面的结论可以得出指数部分为:c=1+127=128   二进制表示为:10000000

(5)尾数部分为01填入即可

最后得出float 2.5在C语言内存中存储的形式为:

0 10000000 01000000000000000000000

下面验证这个结果是否等于2.5?

https://www.h-schmidt.net/FloatConverter/IEEE754.html



java float可以赋值给double吗_机器学习_05

3、下面开始讨论float取值范围

前面知float存储的数字可以写成 ;当b和c最大时候就是float的取值范围。

首先来看c,指数位数为11111111最大,因为这个数有特殊用途,所以要减去1得11111110

接下来看b,可知当b全为1时,11111111111111111111111

此时为最大取值范围。



java float可以赋值给double吗_python_06

故可以得出最后结果float取值范围为:



java float可以赋值给double吗_大数据_07