浮点数(单精度浮点数与双精度浮点数)在计算机中的存储
- 格式:doc
- 大小:85.51 KB
- 文档页数:4
浮点数单精度浮点数与双精度浮点数在计算机中的存储浮点数是一种用于表示实数的数学概念,在计算机中以不同的精度进行存储。
单精度浮点数和双精度浮点数分别以32位和64位的二进制格式来表示实数。
单精度浮点数是按照IEEE754标准规定的,它使用32位来存储一个浮点数。
它将这32位划分为三个部分:符号位、指数位和尾数位。
具体来说,其中1位用于表示符号位(0表示正数,1表示负数),8位用于表示指数位,23位用于表示尾数位。
指数位用于表示浮点数的大小范围,尾数位用于表示浮点数的精度。
单精度浮点数可以表示的范围是从2的-126次方到2的127次方之间。
双精度浮点数也遵循IEEE754标准,它使用64位来存储一个浮点数。
它将这64位划分为三个部分:符号位、指数位和尾数位。
其中1位用于表示符号位,11位用于表示指数位,52位用于表示尾数位。
双精度浮点数的指数位和尾数位比单精度浮点数更长,因此双精度浮点数的精度更高。
双精度浮点数可以表示的范围是从2的-1022次方到2的1023次方之间。
在计算机中,浮点数的存储会存在一定的舍入误差。
这是因为浮点数的二进制表示是有限的,无法准确表示一些实数。
舍入误差会在浮点数的运算和比较中产生影响,可能导致计算的结果和预期不一致。
因此,在使用浮点数进行计算时,需要注意舍入误差的问题,并采取相应的处理措施,如四舍五入或使用更高精度的类型来存储浮点数。
总之,浮点数的存储以单精度和双精度形式存在于计算机中。
单精度浮点数以32位二进制格式存储,双精度浮点数以64位二进制格式存储。
浮点数的存储使用二进制科学计数法,其中包括符号位、指数位和尾数位。
在计算机中存储浮点数会存在一定的舍入误差,需要注意处理。
matlab的数值类型MATLAB(Matrix Laboratory)支持多种数值类型,以满足不同的计算需求。
以下是一些MATLAB中常用的数值类型:双精度浮点数(Double):这是MATLAB的默认数值类型,用于存储64位浮点数。
双精度浮点数提供了很高的精度,适用于大多数科学和工程计算。
单精度浮点数(Single):用于存储32位浮点数。
与双精度浮点数相比,单精度浮点数占用的内存更少,但精度较低。
在处理大量数据或需要减少内存使用的情况下,可以考虑使用单精度浮点数。
整数类型:int8:8位(1字节)有符号整数。
uint8:8位(1字节)无符号整数。
int16:16位(2字节)有符号整数。
uint16:16位(2字节)无符号整数。
int32:32位(4字节)有符号整数。
uint32:32位(4字节)无符号整数。
int64:64位(8字节)有符号整数。
uint64:64位(8字节)无符号整数。
整数类型用于存储没有小数部分的数值。
有符号整数可以存储正数、负数和零,而无符号整数只能存储正数和零。
逻辑类型(Logical):用于存储逻辑值(true 或 false)。
在MATLAB中,逻辑值通常用于条件语句和逻辑运算。
字符和字符串:char:用于存储字符和字符串。
在MATLAB中,字符串实际上是字符数组,每个元素都是一个字符。
string(从MATLAB R2016b开始引入):用于存储可变长度的Unicode字符串。
与char类型相比,string类型提供了更灵活和现代化的字符串处理方式。
复数(Complex):MATLAB支持复数运算,可以使用实部和虚部表示复数。
复数类型可以是双精度或单精度。
在MATLAB中,可以使用class函数来检查变量的数值类型,使用cast函数将变量转换为其他数值类型,还可以使用double、single、int8等函数显式地将变量转换为指定的数值类型。
例如:matlab复制代码x = 1.23; % x 是双精度浮点数y = single(x); % y 是单精度浮点数z = int32(round(x)); % z 是32位有符号整数isLogical = logical(1); % isLogical 是逻辑值true。
浮点数在内存中的存储方式
浮点数是存储浮点计算结果的一种常见数据类型,可以用来表示介于有理数和无理数
之间的数值。
在内存中,浮点数通常以“浮点编码”形式进行存储,其表示方法有IEEE-754标准,按照该标准,浮点数可以用32位或64位表示。
IEEE-754标准,32位浮点编码的存储格式如下:首先用一位来表示有效数字的符号,即正数时为0,负数时为1,后面接8位无符号表示指数域,再接23位有符号表示尾数域。
一般来说,在当前系统中,IEEE-754标准可以分为单精度浮点数(32位)和双精度
浮点数(64位)。
单精度浮点数的存储格式如上所述:第一位为符号位,接下来的八位位指数域,然后是尾数域。
指数域是由八位“2的次幂”组合而成的,尾数域是有效数字的
连续序列。
而双精度格式(64位)的存储形式同样遵循IEEE754标准,区别在于:双精度格式符号位和指数域都是一位,而且指数域长度为11位;尾数域长度则增加到52位。
其存储格
式如下:第一位为符号位,接着是11位指数域,最后跟着52位尾数域。
指数域仍不变,根据尾数域存储了更多的有效数字,因此可以储存较大的数,这就是
双精度格式的优势。
另外,因为双精度格式能够存储更多的位数,可以更为精确地存储我
们的数据,因此,在数值计算中,双精度浮点数常常被使用。
浮点数存储⽅式|--浮点数怎么存储在计算机中 浮点型变量是由符号位+阶码位+尾数位组成。
float型数据⼆进制为32位,符号位1位,阶码8位,尾数23位 double型数据⼆进制为64位,符号位1位,阶码11位,尾数52位|--单精度32位存储 1bit 8bit 23bit|--双精度64位存储 1bit 11bit 52bit 浮点数⼆进制存储形式,是符号位+阶码位+尾数位(针对有符号数) 浮点数没有⽆符号数(c语⾔)|--阶码: 这⾥阶码采⽤移码表⽰,对于float型数据其规定偏置量为127,阶码有正有负, 对于8位⼆进制,则其表⽰范围为-128-127,double型规定为1023,其表⽰范围为-1024-1023 ⽐如对于float型数据,若阶码的真实值为2,则加上127后为129,其阶码表⽰形式为10000010|--尾数: 有效数字位,即部分⼆进制位(⼩数点后⾯的⼆进制位), 因为规定M的整数部分恒为1(有效数字位从左边不是0的第⼀位算起),所以这个1就不进⾏存储|--具体步骤: 把浮点数先化为科学计数法表⽰形式,eg:1.1111011*2^6,然后取阶码(6)的值加上127(对于float) 计算出阶码,尾数是处⼩数点后的位数(1111011),如果不够23位,则在后⾯补0⾄23位。
最后,符号位+阶码位+尾数位就是其内存中⼆进制的存储形式1 eg:2 #include <stdio.h>3 #include <stdlib.h>4 int main(int argc, char *argv[])5 {6 int x = 12;7 char *q = (char *)&x;8 float a=125.5;9 char *p=(char *)&a;1011 printf("%d\n", *q);1213 printf("%d\n",*p);14 printf("%d\n",*(p+1));15 printf("%d\n",*(p+2));16 printf("%d\n",*(p+3));17return 0;18 }1920 output:21 1222 023 024 -525 66|--对于float型: 125.5⼆进制表⽰为1111101.1,由于规定尾数的整数部分恒为1, 则表⽰为1.1111011*2^6,阶码为6,加上127为133,则表⽰为10000101 ⽽对于尾数将整数部分1去掉,为1111011,在其后⾯补0使其位数达到23位, 则为11110110000000000000000 内存中的表现形式为: 00000000 低地址 00000000 11111011 01000010 ⾼地址 存储形式为: 00 00 fb 42 依次打印为: 0 0 -5 66 解释下-5,内存中是:11111011,因为是有符号变量所以符号位为1是负数, 所以其真值为符号位不变取反加⼀,变为:10000101化为⼗进制为-5.。
float和double有什么区别?float和double在游戏⾏业肯定是⽤的很多的,虽然这是个很基础的问题,但是⾯试时被问到还是感觉说的不是很好。
所以还是总结⼀下:float 单精度浮点数在机内占 4 个字节,⽤ 32 位⼆进制描述。
double 双精度浮点数在机内占 8 个字节,⽤ 64 位⼆进制描述。
浮点数在机内⽤指数型式表⽰,分解为:数符,尾数,指数符,指数四部分。
数符占 1 位⼆进制,表⽰数的正负。
指数符占 1 位⼆进制,表⽰指数的正负。
尾数表⽰浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占 24 位,指数符加指数占 8 位 -- float。
数符加尾数占 48 位,指数符加指数占 16 位 -- double。
知道了这四部分的占位,按⼆进制估计⼤⼩范围,再换算为⼗进制,就是你想知道的数值范围。
对编程⼈员来说,double 和 float 的区别是 double 精度⾼,有效数字 16 位,float 精度 7 位。
但 double 消耗内存是 float 的两倍,double 的运算速度⽐ float 慢得多,C 语⾔中数学函数名称 double 和 float 不同,不要写错,能⽤单精度时不要⽤双精度(以省内存,加快运算速度)。
简单来说,Float 为单精度,内存中占 4 个字节,有效数位是 7 位(因为有正负,所以不是8位),在我的电脑且 VC++6.0 平台中默认显⽰是6位有效数字;double为双精度,占 8 个字节,有效数位是 16 位,但在我的电脑且 VC++6.0 平台中默认显⽰同样是 6 位有效数字例⼦:在 C 和 C++ 中,如下赋值语句:float a=0.1;编译器报错:warning C4305: 'initializing' : truncation from 'const double ' to 'float '原因:在 C/C++ 中(也不知道是不是就在 VC++ 中这样),上述语句等号右边 0.1,我们以为它是个 float,但是编译器却把它认为是个 double(因为⼩数默认是 double),所以要报这个 warning,⼀般改成 0.1f 就没事了。
c语言单精度和双精度小数点后几位在C语言中,可以使用单精度浮点数和双精度浮点数来表示小数。
单精度浮点数使用32位存储,而双精度浮点数使用64位存储。
接下来我们将详细介绍这两种浮点数的小数点后几位。
单精度浮点数(float)是C语言中用来表示单精度浮点数的数据类型。
它的有效位数是23位,小数点后大约能保留6-7位有效数字。
具体来说,单精度浮点数的小数点后大约保留6位有效数字。
这是因为单精度浮点数使用了1位来表示正负号,8位来表示指数,以及23位来表示尾数。
因此,在单精度浮点数中,尾数只有23位有效数字。
双精度浮点数(double)是C语言中用来表示双精度浮点数的数据类型。
它的有效位数是52位,小数点后大约能保留15-16位有效数字。
具体来说,双精度浮点数的小数点后大约能保留15位有效数字。
双精度浮点数使用了1位来表示正负号,11位来表示指数,以及52位来表示尾数。
因此,在双精度浮点数中,尾数有52位有效数字。
虽然单精度浮点数的有效位数相对较少,但它的运算速度通常比双精度浮点数要快。
这主要是因为单精度浮点数使用了更少的存储空间,可以在更短的时间内完成计算。
另外,在某些应用场景中,不需要高精度的计算结果,使用单精度浮点数可以节省内存和提高计算速度。
当需要进行高精度的计算时,应使用双精度浮点数。
双精度浮点数的有效位数更多,能够提供更准确的计算结果。
双精度浮点数通常在科学计算、金融计算和图形处理等领域中使用,因为这些领域往往需要更高的精度。
无论是单精度浮点数还是双精度浮点数,在实际编程中,我们可以使用printf函数来控制输出的小数点后几位。
printf函数中的格式化字符串可以使用%.nf来指定小数点后保留的位数,其中n表示要保留的位数。
例如,%.3f表示保留小数点后3位。
需要注意的是,浮点数的舍入方式取决于计算机的浮点数表示规范。
总结起来,C语言的单精度浮点数大约能保留6-7位有效数字,而双精度浮点数大约能保留15-16位有效数字。
浮点数在内存中的存储⽅式1、在使⽤switch(value)时,value的类型可以是浮点吗?2、判断浮点数是否相等时,可以⽤float f1,f2; if(fi==f2){do something;}吗?都不可以。
这涉及浮点数在内存中的存储⽅式。
⼀、float型在内存中占4字节,double占8字节。
单精度float在内存中的存储格式如下图(1位符号位S,8位指数位E,23位有效数字M):双精度double在内存中的存储格式如下图(1位符号位S,11位指数位E,52位有效数字M):本⽂主要说单精度浮点型float,double类似。
(-1)^S * M * 2^E(-1)^S表⽰正负,S=1时为负,S=0时为正;M表⽰有效数字,1<=M<2;2^(E-127)表⽰指数位。
如⼗进制8.125,将其转化成⼆进制形式:对于整数部分8:8/2 商:4 余:04/2 商:2 余:02/2 商:1 余:01/2 商:0 余:1余数逆序,所以8的⼆进制为:1000对于⼩数部分0.125,:0.125*2 整数:0 ⼩数:0.250.25*2 整数:0 ⼩数:0.50.5*2 整数:1 ⼩数:0整数部分正序,所以0.125的⼆进制为:001所以8.125的⼆进制形式为:1000.001,即1.000001 * 2^3。
因是正数,所以,S=0;因M表⽰有效数字,1<=M<2,所以M=1.xxxxxxx,其中⼩数点前的1是固定的,可省略,则M只需要表⽰⼩数点后的数即可,故可⽤23位有效数字表⽰M部分,则8.125的M部分为 000 0010 0000 0000 0000 0000;⽽E部分8位是unsigned char,范围为0~255,但科学计数法的指数部分有正有负,故整体偏移127,⽤0~255来表⽰-127~128,所以8.125的指数E部分,实际写的是E:3+127=130=1000 0010,综上:8.125在内存中的存放bit为 0 1000 0010 000 0010 0000 0000 0000 0000 0000 ,即0x41020000程序验证⼀下:float f=8.125f;unsigned char *p = (unsigned char *)&f;printf("%x %x %x %x\n",p[0], p[1], p[2], p[3]);结果:0 0 2 41⼩端存储模式,低字节在前,⾼字节在后。
关于浮点数存储格式标准浮点数存储标准为:IEEE754。
⼀、定义:什么是IEEE754浮点数在C/C++中对应float和double类型,我们有必要知道浮点数在计算机中实际存储的内容。
IEEE754标准中规定float单精度浮点数在机器中表⽰⽤ 1 位表⽰数字的符号,⽤ 8 位来表⽰指数,⽤23 位来表⽰尾数,即⼩数部分。
对于double双精度浮点数,⽤ 1 位表⽰符号,⽤ 11 位表⽰指数,52 位表⽰尾数,其中指数域称为阶码。
IEEE754规定:单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;双精度浮点数字长64位,尾数长度52,指数长度11,指数偏移量1023;约定⼩数点左边隐含有⼀位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略⼩数点左边的1则为23),双精度尾数长度实际为53(默认省略⼩数点左边的1则问53);下⾯讲述使⽤IEEE754标准表⽰浮点数:176.0625表⽰为单精度浮点数:解:1).先将176.0625转换为⼆进制数⼩数点前:176 / 2 = 88 余数为 088 / 2=44 余数为 044 / 2 =22 余数为 022 / 2= 11 余数为 011 / 2 =5 余数为 15 / 2=2 余数为 12/ 2 =1 余数为 01/ 2=0 余数为 1 商为0,结束。
⼩数点前整数转换为⼆进制:10110000⼩数点后:⼩数部分乘以2,取整数部分,直⾄乘积⼩数部分为00.0625 * 2 = 0.125 整数为00.125 * 2 = 0.25 整数为00.25* 2 = 0.50 整数为00.5* 2 = 1.0 整数为1,⼩数部分为0,结束⼩数点后的⼩数位转换为⼆进制:0001故176.0625转换为⼆进制为:10110000.00012).IEEE754约定⼩数点左边隐含有⼀位,通常这位数是1,所以10110000.0001=1.01100000001 * 2^7(⼩数点向左偏移7位);IEEE754约定单精度指数偏移量为127,所以176.0625使⽤IEEE754标准表⽰时,指数偏移量为 7+127=134 ,即:10000110IEEE754约定单精度尾数长度为23,所以176.0625使⽤IEEE754标准表⽰时,尾数为:01100000001000000000000176.0625>0,即为整数,所以符号位为0由上得出:176.0625使⽤IEEE754规格化后的表⽰为:0 10000110 01100000001000000000000。
浮点数在计算机中的存储浮点数是在计算机中表示实数的一种方法。
它由两个部分组成:尾数和指数。
单精度浮点数和双精度浮点数是两种不同精度的浮点数表示方式。
单精度浮点数采用32位的二进制表示,其中1位表示符号位,8位表示指数位,剩下的23位表示尾数位。
符号位确定数的正负,指数位表示浮点数的指数部分,尾数位表示浮点数的尾数部分。
双精度浮点数采用64位的二进制表示,其中1位表示符号位,11位表示指数位,剩下的52位表示尾数位。
双精度浮点数的存储空间比单精度浮点数更大,因此能够表示更大范围和更高精度的数值。
在计算机中存储浮点数时,会将其转换为二进制,并按照指定的格式存储。
以单精度浮点数为例,符号位、指数位和尾数位会按照一定的规则进行编码和存储。
这种编码方式被称为IEEE754浮点数标准。
根据IEEE754浮点数标准,单精度浮点数的取值范围约为1.4×10⁻⁴⁵~3.4×10³⁸,双精度浮点数的取值范围约为4.9×10⁻³²~1.8×10³⁰⁸。
双精度浮点数相比单精度浮点数能够表示更大范围和更高精度的数值,但同时也需要更多的存储空间。
浮点数在计算机存储中的表示方式是通过将数字拆分成符号、指数和尾数三个部分,并使用二进制编码进行存储。
这种表示方式能够满足大多数实数的表示需求,但由于浮点数在计算机中的存储是近似表示,所以在进行浮点数运算时可能会存在一定的舍入误差。
因此,在高精度计算或要求精度较高的应用中,可能需要采用其他更精确的表示方法。
浮点数(单精度浮点数与双精度浮点数)在计算机中的存储在计算机中,浮点数是以特定的格式存储的,这种格式可以表示实数的整数部分和小数部分。
根据精度的不同,浮点数可以分为单精度浮点数(float)和双精度浮点数(double)。
这两种类型的浮点数在计算机中的存储方式略有不同。
1.单精度浮点数(float)单精度浮点数使用32位(bit)来存储,其中1位用于符号(sign),8位用于指数(exponent),23位用于尾数(mantissa)。
这种表示方法可以提供大约6位十进制的精度。
符号位(sign bit):占用了第0位,用于表示正负。
0表示正数,1表示负数。
指数位(exponent bits):占用了第1到第8位,用于表示浮点数的指数部分。
这部分采用了偏移编码,也就是将实际指数值加上一个偏移量(bias),一般这个偏移量是127。
尾数位(mantissa bits):占用了第9到第31位,用于表示浮点数的小数部分。
这部分通常被归一化,即小数点移动的位置被记录在指数中,而小数点后面的具体数值被记录在尾数中。
2.双精度浮点数(double)双精度浮点数使用64位(bit)来存储,其中1位用于符号(sign),11位用于指数(exponent),52位用于尾数(mantissa)。
这种表示方法可以提供大约15位十进制的精度。
符号位(sign bit):占用了第0位,用于表示正负。
0表示正数,1表示负数。
指数位(exponent bits):占用了第1到第11位,用于表示浮点数的指数部分。
这部分同样采用了偏移编码,偏移量一般是1023。
尾数位(mantissa bits):占用了第12到第63位,用于表示浮点数的小数部分。
这部分通常被归一化,即小数点移动的位置被记录在指数中,而小数点后面的具体数值被记录在尾数中。
无论是单精度浮点数还是双精度浮点数,它们都需要遵循IEEE 754标准,这个标准详细规定了浮点数的存储格式以及如何进行算术运算。
浮点数在计算机中的存储
十进制浮点数格式:
浮点数格式使用科学计数法表示实数。
科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数(exponent)两部分。
比如3.684*10^2. 在十进制中,指数的基数为10,并且表示小数点移动多少位以生成系数。
每次小数点向前移动时,指数就递增;每次小数点向后移动时,指数就递减。
例如,25.92 可表示为2.592 * 10^1,其中2.592 是系数,值10^1 是指数。
必须把系数和指数相乘,才能得到原始的实数。
另外,如0.00172 可表示为1.72*10^-3,数字1.72 必须和10^-3 相乘才能获得原始值。
二进制浮点格式:
计算机系统使用二进制浮点数,这种格式使用二进制科学计数法的格式表示数值。
数字按照二进制格式表示,那么系数和指数都是基于二进制的,而不是十进制,例如1.0101*2^2.
在十进制里,像0.159 这样的值,表示的是0 + (1/10) + (5/100) + (9/1000)。
相同的原则也适用二进制。
比如,1.0101 乘以2^2 后,生成二进制值101.01 ,这个值表示二进制整数5,加上分数(0/2) + (1/4) 。
这生成十进制值5.25 。
下表列出几个二进制
编写二进制浮点值时,二进制通常被规格化了。
这个操作把小数点移动到最左侧的数位,并且修改指针进行补偿。
例如1101.011 变成1.101011*2^3
浮点数的存储
•IEEE 标准754 浮点数标准使用3 个成分把实数定义为二进制浮点值:
•符号
•有效数字
•指数
符号位表示值是负的还是正的。
符号位中的1 表示负值,0 表示正值。
有效数字部分表示浮点数的系数(coefficient)(或者说尾数(mantissa))。
系数可以是规格化的(normalized),也可以是非规格化的(denormalized)。
所谓规格化,就是任何一个数的科学计数法的表示都可为1.xxx*2^n,既然小数点左边的一位都是1,就可以把这一位省略。
单精度浮点数23bit的尾数部分,可表示的精度却为24位,道理就在这里。
指数表示浮点数的指数部分,是一个无符号整数。
因为指数值可以是正值,也可以是负值,所以通过一个偏差值对它进行置偏,及指数的真实值=指数部分的整数—偏差值。
对于32位浮点数,偏差值=127;对于64位浮点数,偏差值=1023.
浮点数的这3 个部分被包含在固定长度的数据格式之内。
IEEE 标准754 定义了浮点数的两种长度:32位单精度和64位双精度
可以用于表示有效数字的位的数量决定精度。
下图显示了两种不同精度类型的位布局:
单精度浮点使用23 位有效数字值。
但是,浮点格式假设有效数字的整数部分永远为1 ,并且不在有效数字值中使用它。
这样实际上有效数字的精度达到了24 位。
指数使用8 位值,它的范围从0~255,称为移码指数,意思是必须从指数中减去一个数(称为偏移量或者是偏差值),对单精度浮点数而言,这个值是127 。
当指数是0和255时,指数由别的含义,因此实际指数的范围是从-126 到+127 (二进制指数),这样整个浮点数的范围则为:(1.18 *
10^-38~1.0×2……-126 到3.40 * 10^38~1.1……1×2^127)。
•指数0和255用于特殊用途。
如果指数从1变化到254,则由s(符号位)、e(指数)和f(有效数)来表示的数为:
•
•-1的s 次幂是数学上的一种方法,意思是“如果s 为0,则数是正的(因为任何数的0 次幂等于1 );如果s 为1,则数是负的(因为-1的1 次幂为-1)”。
•表达式的另一部分是1.f,意思是1后面为二进制小数点,再后面为23位的有效小数部分。
它乘以2的幂,其中指数为内存中的8位移码指数减去127。
•注意,还有一种特殊的情况0 :
•如果e 等于0,且f 等于0,则数为0。
通常,所有32位均为0 则表示0。
但是符号位可以是1,在这种情况下,数被解释为-0。
-0 可以表示一个很小的数,小到在单精度格式中不能用数字和指数来表示。
尽管如此,它们然小于0。
•如果e 等于0,且f 不等于0,则数是有效的。
但是,它不是规格化的数,它等于
注意,二进制小数点左边的有效数为0。
•如果e等于255,且f等于0,则数为正或负无穷大,这取决于符号s。
•如果e等于255,且f不等于0,该值被认为“不是一个数”,简写为NaN。
NaN可以表示一个不知道的数或者一个无效操作的结果。
Q:3.40 * 10^38 是值怎么来的?
A :在单精度浮点格式中可以表示的最大规格化的正或负二进制数为:
换算成10 进制约等于:3.402823669e+38,这里1.111...111 近似为2,则 2 * 2^127 = 2^128 = 3.402823669e+38 .
Q:1.18 * 10^-38 的值是怎么来的?
A:通常,单精度浮点格式中可以表示的最小规格化的正或负二进制数为:
换算成10 进制就是:1.175494351e-38,也就是约等于1.18 * 10^-38 。
Q:单精度浮点24位换算为十进制后,为什么精度是7 位?
A:10位二进制数近似等于3位十进制数。
也就是说,若10位都置1(即十六进制为3FFh,十进制为1023),则它近似等于3位十进制都设置为9,即999。
或者:
这种关系表明按单精度浮点格式存放的24位二进制数大约与7位十进制数等效。
因此,也可以说单精度浮点格式提供24位二进制精度,或大约7位十进制精度。
可以这么设,一个2 相当于10^k 次方,即10^k=2。
那么2 的24 次方2^24 = 10^24k 。
从10^k=2 可以知道k = log10(2)~0.301。
所以,2 的24 次方换算到十进制,相当于有24*log10(2)约等于7.2 个精度。
Q:262144.00 和262144.01 是一样的么?
A:当然不是一样的!但是在计算机里,单精度的存储中,它们却是一样的!看这两个数作为单精度浮点数时在计算机里是怎么存储的:
两者被存储为同一个数字:。
那这是为什么呢?原因是,规格化单精度浮点里,在小数点后有23 位数,而1.000...000 会经过2^18 次方的运算后小数点会往前移动18 个,那么小数点后面就只剩下5 位,这时即使是
1/(2^5)=0.03125 都要比0.01大,所以没办法,只能存为一样的数。
那么上面的问题如何避免呢?
答案是,使用双精度浮点数。
双精度浮点数的指数偏移量为1023,即3FFh,所以,以这种格式存放的数为:
它具有与单精度格式中所提到适用于0、无穷大和NaN等情形相同的规则。
最小的双精度浮点格式的正数或负数为:
最大的数为:
用十进制表示,它的范围近似为。
10的308次幂是一个非常大的数,在1后面有308个十进制零。
53 位有效数(包括没有包含在内的那1位)的精度与16个十进制位表示的精度十分接近。
相对于单精度浮点数来说这种表示要好多了,但它仍然意味着最终还是有一些数与另一些数是相等的。
例如,140737488355328.00与140737488355328.01是相同的,这两个数按照64位双精度浮点格式存储,结果都是:42E0000000000000h
可把它转换为:
由上面可以看到,在双精度的浮点下,整数部分+小数部分的位数一共有17 位。