二进制数怎么转化为浮点数?阶码又是怎么算出来的?

因此,在一个定点整数中,数符位右边的所有二进制位数表示的是一个整数值。

C/C++中, 浮点数,float以及 double 在内存中是怎样存储的?

二进制浮点数_二进制浮点数阶码怎么求二进制浮点数_二进制浮点数阶码怎么求


二进制浮点数_二进制浮点数阶码怎么求


二进制浮点数_二进制浮点数阶码怎么求


如,我有32-bit

8bit 8bit 8bit 0 0 0 0 0 1 1 1 1

对于整形int,我们可以很快得出,这是 int i = 15的内存形式。

设,位的bit的位权为-1,位为30。 那么这个就不再表示数字15了,而是

2^-1+2^0+2^1+2^2 = 7.5 了。

当然,上面只是设,那么真正的Float 浮点型 在内存中是什么样子的呢?

首先需要知道的是 float 在内存中 占 32-bit double型 占 64-bit。

浮点型 在内存中,有3部分构成。

Sign bit

Exponent (指数)

Mantissa(尾数,有效数字)

sign bit

是指浮点数在内存中的 位,0 表示 正数,1 表示负数。Sing bit 在浮点数float,32-bit内存中,占 1-bit 。

Exponent

指数,比如 10^5,2^6,这两个数的 5,6既是exponent。当然,数字在内存中都是以2进制体现的,所以这里的指数,是指以2为底 的指数。比如

0 0 0 0 0 1 1 0

很容易可以知道 Exponent为 6,在表示浮点数的内存中,表示的是 2^6 = 64。

Expoent 在 Float 32-bit的内存中,占8-bit,在这里把此8-bit视为表示unsigned int 的bit pattern。那么可以表示的范围是0~256的整数(指数范围), 但是指数既可以为正整数,也可以为负整数,这样以来无法表示-1,-2....这样的负整数了,所以 IEEE Standard 754 Floating-Point 对此引入了Bias, 偏移量的概念,对于Float型,此偏移量为127. 也就是说 127 这个数字已经被存储到 Exponent这个部分中了,像之前的那个例子,

0 0 0 0 0 1 1 0

如 2^(1),指数1在float 的内存结构中的 bit pattern是什么样子的?

那会不会就是简单的

0 0 0 0 0 0 0 1

应该是 exponent - 127 = 1;(2^(1)中的指数1是这样得来的)

exponent = 127+1 = 128.(2^(1)中的指数1,在float内存结构中应该是128的bit pattern才对)

1 0 0 0 0 0 0 0

这只是个例子,帮助理解exponent,不会真的问这样的问题。。。。

Double型,需要占用64-bit 内存空间。同样,也是由 Sign bit,Exponent,Mantissa 3部分构成,不过 Exponent部分,在整个64-bit中 要占到 11-bit。此外偏移量 为1023。

Mantissa

Mantissa 尾数部分,在float的32-bit的内存空间中,占到23-bit注意之前说的exponent 指数,位是从0开始的,那么Mantissa,尾数的位当然是 -1了。

0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

那么大家说下,上面的尾数部分在 float 浮点数的内存中,表示多少? 很幂是二进制10000010或十进制130,130减去127是3,就是实际的幂。快可以得到是

2^(-2)+2^(-3) = 0.375。 有错了,应该是1.375。

大家回想下小学学的 科学记数法,5 = 5.010^0 , 0.75 = 7.510^(-1)。对吧?

在Float的内存表示中,这23-bit的尾数 仅仅表示 科学记数法 中 非零实数小数点后的精度。 换句话说,Mantissa 包括两部分,一个是leading bit(科学记数法的非零实数),另一个是fraction bits(即精度),此23-bit仅仅表示的是 fraction bits。而在二进制中,非零实数自然是1了,所以leading bit默认是1了。所以上述表格实际上是表示

引用

1 + 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

这也就是为什么,在float的内存中,尾数部分可以用23-bit pattern 来表示出24-bit的不同数字了。

在Double型的 64-bit 内存结构中,尾数部分要占到52-bit。

我们用个表格来表示 在内存中,float是怎样存储的。

+/-Sign Exponent 指数 Fraction bit -> .f

s <---------------- 8 ----------------> <-------------------------------------- 23----------------------------->

Unsigned int 2^(-1), 2^(-2), 2^(-3)............

上面这个表格所要 表示的是如下的浮点数

(-1)^s 1.f 2^(Exponent-127)

随手写了个32-bit pattern,

0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2^8 2^0 2^-23

这个浮点数可以很快的得到 (-1)^01.(2^-2+2^-3)2^(2^1+2^2+2^4-127)。

如何用二进制表示一个小数

整数部分5用2进制为101

小数部分0.6

有这样符号位是1 表示一个负数一个公式: 2 如果<1就为0,基数=基数;大于1,就为1,基数=基数-1

0.62=1.2>0 那么就为1 基数=1.2-1=0.21001010010001010001

0.22=0.4<0 那么就为0,基数=0.4

0.42=0.8<0,那么就为0,基数=0.8

0.82=1.6>0 那么就为1,基数为1.6-1=0.6

所以5.6可以表示为:101.1001

想往下面再乘,就更了

用浮点数表示啊

谁可以帮我解决下面这十进制转换成二进制定点数和浮点数的问题

表示的是指数6,但是在float内存结构中,其实表示的是 (6-127)= -121。需要减去已存入的偏移量 127。

把十进制的29.86表示成二进制的浮点数,尾数24位,阶码8位

若将上述值表示为十六进制数,则为(C2 5C 00 00)16。

正的54为

-000110110

补码形式为

111001010

而你说的-01100100十进制其实是

-100

(1100101.101)2的等值十进制

110是6的二进制表示

在python中 float是什么意思?

浮点型(Float)

Python的浮点数就是数学中的小数,类似C语言中的double。

在运1866 = 0001 1000 0110 0110 = 1.1000 0110 0110 x 2^12算中,整数与浮点数运算的结果是浮点数.

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是相等的。浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是的而浮点数运算则可能会有四舍五入的误。

float( [x])

Convert a string or a number to floating point. If the argument is a string, it must contain a sibly signed decimal or floating point number, sibly embedded in whitespace. Otherwise, the argument may be a plain or long integer or a floating point number, and a floating point number with the same value (within Python's floating point precision) is returned. If no argument is given, returns 0.0.

Note: When passing in a string, values for NaN and Infinity may be returned, depending on the underlying C library. The specific set of strings accepted which cause these 根据IEEE浮点数的定义,去掉前导零values to be returned depends entirely on the C library and is known to vary.

float型数据,浮点型

也就是小数的意思

就像int类型...

浮点数在内存中的表示方法

因此,-2.5的二进制表示为:11000000001010000000000000000000

浮点数保存的字|小数位节格式如下:

地址 +0 +1 +2 +3

内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

S 代表符号位,1是负,0是正

E 偏移127的幂,二进制阶码=(EEEEEEEE)-127。

M 24位的尾数保存在23位中,只存储23位,位固定为1。此方法用最较少的位数实现了

较高的有效位数,提高了精度。

零是一个特定值,幂是0 尾数也是0。

浮点数-12.5作为一个十六进制数0xC1480000保存在存储区中,这个值如下:

地址 +0 +1 +2 +3

内容0xC1 0x48 0x00 0x00

浮点数和十六进制等效保存值之间的转换相当简单。下面的例子说明上面的值-12.5如何转

换。

浮点保存值不是一个直接的格式,要转换为一个浮点数,位必须按上面的浮点数保存格式表

所列的那样分开,例如:

地址 +0 +1 +2 +3

格式 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

二进制 11000001 01001000 00000000 00000000

十六进制 C1 48 00 00

从这个例子可以得到下面的信息:

尾数是后面的二进制数10010000000000000000000

在尾数的左边有一个省略的小数点和1,这个1在浮点数的保存中经常省略,加上一个1和小数

点到尾数的开头,得到尾数值如下:

1.10010000000000000000000

指数是3,尾数调整如下:

1100.10000000000000000000

结果是一个二进制浮点数,小数点左边的二进制数代表所处位置的2的幂,例如:1100表示

(12^3)+(12^2)+(02^1)+(02^0)=12。

小数点的右边也代表所处位置的2的幂,只是幂是负的。例如:.100...表示(12^(-1))+

(02^(-2))+(02^(-2))...=0.5。

这些值的和是12.5。因为设置的符号位表示这数是负的,因此十六进制值0xC1480000表示-

12.5。

二进制计算问题,浮点表示

符位:0表示正数,1表示负数。

你的等式是不是有问题呀,中间的应该是2^2 就是逢二进一

存储实数(浮点数)

一个数字的浮点表示法由三个部分组成:符号、位移量(指数)、定点数。

例如:

实际数字:7400000

科学计数法:7.425×10^9

这三部分为符号(+)、位移量(9)以及定点部分(7.425)。注意位移量就是指数。

例如:

实际数字:101001000

科学计数法:1.01001×2^8

所以,为了使表示法的固定部分统一,无论是十进制的数还是二进制的数都写成以下形式

十进制——————±d.xxxxxxxxxxx 注意:d是0到9的数,每个x都是0到9的数

二进制——————±1.yyyyyyyyyyy 注意:每个y都是0或者1

在一个二进制数规范化之后,我们只存储该数的三部分信息:符号、指数、尾数。

例如:+1.0001110101×2^6

符号为+、指数6、尾数0001110101(注意小数点左边的1并不存储,它是隐含的)

尾数就是直接用无符号的数存储,指数部分应该用有符号的数存储,即补码存储,因为指数有可能是负数。但现在已经被一种叫余码系统的新方法所取代。在这种余码系统中,正的和负的数都可以作为无符号数存储,方法就是在指数的基础上统一加上一个数,这个数就是偏移量,它是2n-1,n是内存中存储指数的位数。如:指数占8位,那么偏移量就是127。这样做的好处就是指数经过加上偏移量后,所有的指数都将变成正数,统一用无符号数存储了!!

IEEE标准

如今我们在计算机中存储实数分为单精度和双精度。IEEE为我们制定了相关的格式和标准具体如下:

单精度共占32位

占1位 占8位 占23位

因为指数位占8位,所以偏移量为127,即余127码

双精度共占64位

占1位 占11位 占52位

因为指数位占11位,所以偏移量为1023,即余1023码

例题:写出5.75的单精度表示法?(余127码)

1、 符号为正,所以符号位S=0

2、 十进制5.75转换为二进制位(101.11)2

3、 规范化:化为2进制是整数部分除以二知道变为1101.11=1.0111×2^2

4、 所以指数E=2+127=129=(10000001)2 尾数M=0111,不够23位在后面添19个0

5、 该数的表示法为:

0 10000001 01110000000000000000000

符号 指数 尾数

6、所以5.75采用单精度存储,在计算机中应为01000000101110000000000000000000

大概就是这些知识点了

单精度浮点数和双精度浮点数有啥区别?

尾数为101 1100 0000 ... 0000 B;

1、数据长度不同:

单精度浮点数用4字节存储。双精度浮点数用8字节存储,一般用于计算机变成中定义变量,占用8个字节存储空间。整型在内存中可能占2或4个字节(通常分别在16位机和32位机上),其取值为基本::整常数。长整型,长度至少32位,而64位类Unix系统为64位。

2、类型说明符不同:

整型类型说明符为int。长整型类型说明符为long int或long,64位整型(非ANSI标准)类型说明符为__int64、long long int或long long。双精度浮点数(double)类型是在IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)中定义的,双精度浮点数(Double)。Single单精度浮点型。

3、数值范围不同:

long int表示:-2147483648~2147483647,unsigned long可以表示0~4294967295。基本整型的十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。双精度其数值范围为-1.7E-308~1.7E+308,单精度浮点数可以表示的范围为±3.40282 10^38。

参考资料来源:

参考资料来源:

参考资料来源:

参考资料来源:

二进制如何表示负数?

float 就是浮点数,看python的manual

小数部分乘以2直到变为1

,符号位0表示正1表示负

正数:原码=补码

负数:

原码

=正数部分(去掉负号)的二进制值,且符号位(最左边的比特位)为1

反码

=正数部分(去掉负号)的二进制值,按位30 ~ 23取反

补码

=反码

+1

小数点依旧用点

定点数

所谓定点数是指小数点位置固定不变的数。在计算机中,通常用定点数来表示整数与纯小数,分别称为定点整数与定点小数。

数符位

数值位

小数位

定点小数:一个数的二进制位是数符位,用来表示数的符号;而小数点的位置默认为在数符位后面,不单独占一个二进制位,如图所示:

数符位|小数位

数值位

因此,在一个定点小数中,数符位右边的所有二进制位数表示的是一个纯小数。

2.浮点数

在计算机中,定点数通常只用于表示整数或纯小数。而对于既有整数部分又有小数部分的数,由于其小数点的位置不固定,一般用浮点数表示。

在计算机中所说的浮点数就是指小数点位置不固定的数。一般地,一个既有整数部分又有小数部分的十进制数D可以表示成如下形式:

D=R10N

其中R为一个纯小数,N为一个整数。

如一个十进制数123.456可以表示成:0.123456103,十进制小数0.00123456可以表示成0.12345610-2。纯小数R的小数点后位一般为非零数字。

同样,对于既有整数部分又有小数部分的二进制数口也可以表示成如下形式:

D=R2N

其中R为一个二进制定点小数,称为D的尾数;N为一个二进制定点整数,称为D的阶码,它反映了二进制数D的小数点的实际位置。为了使有限的二进制位数能表示出最多的数字位数,定点小数R的小数点后的位(即符号位的后面一位)一般为非零数字(即为“1”)。

在计算机中,通常用一串连续的二进制位来存放二进制浮点数,它的一般结构如图所示:

阶符

N数符

R|

阶码部分

尾数部分

二进制数的定点及浮点表示 看的真晕。 搞不懂

定点表示法,意味着小数点在有效位的前面,位置为固定的。浮点000110110表示法,用十进制来说明的话,例如:83.125可写成10^2×0.83接着,根据指数调整尾数.一个负的指数向左移动小数点.一个正的指数向右移动小数点.因为125,10^3×0.083125,10^4×0.0083125。即表示小数点位置是可变的,小数点位置改变后一个二进制数能够用一种普遍的形式来表示:

2^E×F

其中E称为阶码,F叫做尾数。把用阶码和尾数表示的数叫做浮点数。浮点数的表示不是的。当小数点的位置改变时,阶码也随着相应改变。