IEEE 754 浮点数在计算机中的表示方法

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80比特实做)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE浮点数格式与算术,但有些将其列为非必需的。例如,IEEE 754问世之前就有的C语言,现在有包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。

该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)[1]。后来还有“与基数无关的浮点数”的“IEEE 854-1987标准”,有规定基数为2跟10的状况。现在最新标准是“IEEE 854-2008标准”。

在六、七十年代,各家计算机公司的各个型号的计算机,有着千差万别的浮点数表示,却没有一个业界通用的标准。这给数据交换、计算机协同工作造成了极大不便。IEEE的浮点数专业小组于七十年代末期开始酝酿浮点数的标准。在1980年,英特尔公司就推出了单片的8087浮点数协处理器,其浮点数表示法及定义的运算具有足够的合理性、先进性,被IEEE采用作为浮点数的标准,于1985年发布。而在此前,这一标准的内容已在八十年代初期被各计算机公司广泛采用,成了事实上的业界工业标准。

IEEE 754浮点数的三个域

  • 单精度二进制小数,使用32个比特存储。
1 8 23 位长
S Exp Fraction
31 3023
偏正值(实际的指数大小+127)
220 位编号(从右边开始为0)

S为符号位,Exp为指数字,Fraction为有效数字。 指数部分即使用所谓的偏正值形式表示,偏正值为实际的指数大小与一个固定值(32位的情况是127)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。单精度的指数部分是−126~+127加上偏移值127,指数值的大小从1~254(0和255是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。

  • 双精度二进制小数,使用64个比特存储。
1 11 52 位长
S Exp Fraction
63 6252
偏正值(实际的指数大小+1023)
510 位编号(从右边开始为0)

S为符号位,Exp为指数字,Fraction为有效数字。指数部分即使用所谓的偏正值形式表示,偏正值为实际的指数大小与一个固定值(64位的情况是1023)的和。采用这种方式表示的目的是简化比较。因为,指数的值可能为正也可能为负,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。正因为如此,指数部分通常采用一个无符号的正数值存储。双精度的指数部分是−1022~+1023加上1023,指数值的大小从1~2046(0(2进位全为0)和2047(2进位全为1)是特殊值)。浮点小数计算时,指数值减去偏正值将是实际的指数大小。

  • 利用C语言实现IEEE浮点数二进制与十进制转换
 1 #include "stdafx.h"
 2 #include "stdio.h"
 3 #include "time.h"
 4 #include <iostream>
 5 #include <bitset>
 6
 7 using namespace std;
 8
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     float A=1.25;
12     float B;
13     _ULonglong nMem = *(_ULonglong *)&A;             // 获取内存中保存的A的值
14     bitset<32> BitA(nMem);                          // 按照32位浮点数格式表达
15     cout<<"转换结果为二进制:"<<endl;
16     cout<<BitA<<endl;
17
18     B= *(float *)&BitA;             // 获取内存中保存的input的值并按浮点数格式表达
19     cout<<"转换结果为十进制:"<<endl;
20     cout<<B<<endl;
21 }

IEEE 754 浮点数在计算机中的表示方法

时间: 2024-10-08 05:22:08

IEEE 754 浮点数在计算机中的表示方法的相关文章

IEEE 754 浮点数的表示精度探讨

IEEE 754 浮点数的表示精度探讨 前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处.我曾经做过数值算法程序,虽然基本可用,但是被浮点数精度问题所困扰:事情过后,我花了一点时间搜集资料,并仔细研究,有些心得体会,愿意与大家分享,希望对IEEE 754标准中的二进制浮点数精度及其相关问题给予较为详尽的解释.当然,文中任何错误由本人造成,由我承担,特此声明. 1. 什么是IEEE 754标准? 目前支持二

浮点数在计算机中存储方式

浮点数在计算机中存储方式 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的, float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个

关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)

先看一段推理<*一切都是在8个比特位的前提下,讨论二进制的符号位,溢出等等,才有意义*> +124:0111 1100 -124:1000 0100 +125:0111 1101 -125:1000 0011 +126:0111 1110 -126:1000 0010 +127:0111 1111 -127:1000 0001 +128:0 1000 0000   -128:1000 0000 从上述过程对比可以看出:+128是在127的基础上加1得到,但是会造成溢出(JAVA中byte的大小

IEEE 754浮点数表示标准

二进制数的科学计数法 C++中使用的浮点数包括采用的是IEEE标准下的浮点数表示方法.我们知道在数学中可以将任何十进制的数写成以10为底的科学计数法的形式,如下 其中显而易见,因为如果a比10大或者比1小都能够再次写成10的指数的形式,如 然而要想在二进制的世界中将数字写成以10为底的科学计数法的形式,着实有点麻烦,因为你首先需要将二进制的数先化成10进制的表示方法,然后才能写成科学计数法的形式.但是如果我们稍微变通一下科学计数法的标记方法,问题就变得特别的简单了.之所以数学上使用的科学计数法选

如何理解IEEE 754标准对Java中float值和double值的规定

在Java语言中,我们可以使用float和double这两种基本数据类型来表示特定的数据. 这两种数据类型,本质上是浮点数(floating-point number),浮点是一种对于实数的近似值数值表现法,由一个有效数字加上幂数来表示. 之所以使用浮点数,是因为计算机在使用二进制运算的过程中,无法将所有的十进制小数准确的换算为二进制,只能使用近似值来表示. 使用浮点数表示数值的方法很多,在Java中,和C语言一样,float和double都采用了使用最为广泛的IEEE 754标准. IEEE

浮点数在计算机中的表示

浮点数: 1.解决的问题: 在计算机中存储实数 2.介绍科学计数法 a*10^n (10>a>1) 举例:1.23*10^2 小数点的位置和底数(10)是不会变动的 所以们可以只存123和2 比如一个四元组能存2^4 16个整数 但如果是用这种科学记号表示法规则我们可以存12300000000 因为 1.23*10^10 举例:2^7是128 所以找7个位来表示123 找4个位来表示10.... (位元组 指字节) (位元 指位) 原文地址:https://www.cnblogs.com/er

负数在计算机中的表示方法

假设有一个int类型的数,值为5,在计算机中的表示为:(int型的数占4个字节,32位)所以前面会有一堆0 00000000 00000000 00000000 00000101 现在想知道-5在计算机中怎么表示? 在计算机中,负数以其绝对值的补码形式表达. 需要先获得其绝对值的原码,再得反码,再得补码. 首先理解几个概念:原码.反码.补码 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码. 如:00000000 00000000 00000000 00000101 是5的原码. 反码:

浮点数在计算机中的存储

一,基础预备知识 1,十进制转换为二进制 1.1 整数部分: 连续,除以2,取余数,余数为0或1,53 / 2 = 26R1    26 / 2 = 13R0    13 / 2 = 6R1    6 / 2 = 3 R0   3 / 2  = 1 R1    1/2 = 0R1 ,对应二进制为110101(从右往左) 1.2 小数部分: 连续乘以2,大于1取1,如0.7转换成二进制为:0.7*2 = .4 + 1   0.4*2 = 0.8 + 0   0.8*2 = 0.6 + 1   0.

IEEE 754标准浮点数

一.IEEE 754浮点数的表示 浮点数数学表示: 符号位(sign):决定该浮点数的正负 尾数(significand):二进制小数,范围在[1,2)或者[0,1)中 阶码(exponent):对浮点数加权,权重为2的E次幂 单精度浮点数:在单精度的浮点数中,符号位编码为1位二进制位,阶码编码为为8位二进制位,尾数编码为23位二进制位: 双精度浮点数:在双精度浮点数中,符号位编码为1位二进制位,阶码编码为为11位二进制位,尾数编码为52位二进制位: 二.浮点数编码知识储备 <1>浮点数阶码的