浮点数的表示

浮点数分为单精度(float)和双精度(double),它们的表示方法很特别,区别于整数,我们常用的十进制表示法也有穷尽不能表示的数,更不用说二进制了,那么他们是怎么表示的呢?

首先要知道11.11(二进制) 这个该怎么换算?  11.11 = 1*2^1+1*2^0+1*2^-1+1*2^-2   以此类推。

那么计算机表示浮点数,需要三种位模式+两个常数,符号位(1位)+ 阶码位(k位)+ 尾数位(n位) , 一个常数bias作为偏置量,bias=2^(k-1)-1,一个常数是1。1.11*2^4 = 11100 ,1.11*2^-4 = 0.000111   阶码就是指数,小数点后面乘号之前是尾数位,符号位不说了。很简单对吧,但是这里有小细节! 指数并不是单纯的阶码而已,阶码-bias = 指数,我们假定六位浮点数中,k=3,n=2,那么bias=3,随便拿一个数出来,0 110 11,  为了容易看我分开写了,阶码=110=6   指数 = 6-3 = 3; 那尾数位怎么办呢,尾数位=11 最后写出来就是 0.11*2^3 但是这不符合科学计数法标准,所以加一!那么最后结果就是 1.11*2 ^3 = 14  这也是六位浮点数所能表示的最大正数,为什么呢? 110上边还有111呢? 14怎么可能是最大的,事实是阶码 000 和 111 被占用了 用来表示一些特殊的数,所以阶码编码只能从 001 到 110,所以想当然 0 001 11 是最小的负数。

上面说了 阶码000 和 111 被用来表示一些特殊的数,什么数呢? 还是6位浮点数  011100 表示正无穷; 111100 表示负无穷。当然还有其他的数这里就不说了(本来想画个数轴来表示,会更好一点,可是,不知道怎么画,总不能在纸上画出来用照片截吧=。=)

时间: 2024-10-25 04:12:19

浮点数的表示的相关文章

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

单精度浮点数

单精度浮点数格式 是一种计算机数据格式,在计算机存储器中占用4个字节(32 bits),利用"浮点"(浮动小数点)的方法,可以表示一个范围很大的数值. 在 IEEE 754-2008 的定义中,32-bit base 2格式被正式称为binary32格式.这种格式在IEEE 754-1985被定义为single,即单精度. 需要注意的是,在更早的一些计算机系统中,也存在着其他4字节的浮点数格式. 定义 第1位表示正负,中间8位表示指数,后23位表示有效数位. 正负号0代表正,1代表负.

Javascript优化后的加减乘除(解决js浮点数计算bug)

说明 众所周知,js在计算浮点数时候,结果可能会不准确.比如:(在chrome中的运算结果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.840000000000001 2.1 / 0.3 = 7.000000000000001 网上流传的代码(有bug) 网上流传的优化后的代码如下(有问题的代码,请勿使用) function add(a, b) { var c, d, e; try {

Java 浮点数 float或double类型的表示范围和精度

隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数.有时候会产生让人觉得莫名其妙的事情. 如在java中, 0.99999999f==1f //true 0.9f==1f //false 要明白这些,首先要搞清楚float和double在内存结构 1.内存结构 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) dou

浮点数问题

(1)浮点数是有理数的集合,有些有理数不能表示,会有舍去误差如0.1等. (2)浮点数可以表示的连续整数也是有限的. 有些脚本语言,比如awk,lua中都是使用浮点数来存储整数的,也就是说,我们在语言中使用的整数,在语言内部是使用浮点数来表示的.我们知道,浮点数的运算中通常存在着一定的误差,所以整数是否能被浮点数精确表示呢?答案是可以,不过不是所有范围的整数都可以被精确的表示.由于浮点数精度的问题,所以浮点数的分布也就呈现出非均匀分布. 先简单介绍一下一个常用的浮点数在计算机中的组成,最常用的浮

NOI-1.3-11-计算浮点数相除的余数

11:计算浮点数相除的余数 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 计算两个双精度浮点数a和b的相除的余数,a和b都是正数的.这里余数(r)的定义是:a = k * b + r,其中 k是整数, 0 <= r < b. 输入 输入仅一行,包括两个双精度浮点数a和b. 输出 输出也仅一行,a÷b的余数 样例输入 73.263 0.9973 样例输出 0.4601 提示 注意:输出时小数尾部没有多余的0,可以用下面这种格式:double x;x =

浮点数类型转换的及其内存模型

先看一段测试code: void do_test() { unsigned int uValue = 0xC1480000; printf("uValue = %u,%d,%x,&uValue = %p\n",uValue,uValue,uValue,&uValue); float fValue1 = (float) uValue; printf("fValue1 = %f,&fValue1 = %p, *((unsinged int*)&fV

程序中关于浮点数计算的问题

在进行数值计算编程的过程中往往需要用到浮点数的计算,但浮点数的加减运算通常是会出现误差的.具体出现问题代码如下: double begin = 0.0; //起始位置 double end = 20.0;  //结束位置 int k = 2;  //核函数支持半径的倍数 double initialDis = 0.1;   //粒子间的初始距离(需要与粒子的控制体积保存一致性) /*****************第一步初始化粒子**********/ for(double i=begin-(2

第二章 Java浮点数精确计算

1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用BigDecimal. 2.代码 package com.xxx.util; import java.math.BigDecimal; /** * 浮点数精准算法 */ public class BigDecimalArithUtil { private static final int DIV_SCAL

js实现浮点数保留两位小数代码

js实现浮点数保留两位小数代码:过浮点数小数点后面的数字太长的话,可能需要进行截取操作,下面是一段这样的实例代码和大家分享一下.代码如下: var num=3.1415926; console.log(num.toFixed(2)) 以上代码比较简单,这里就多介绍了,具体可以参阅javascript的Number对象的toFixed()方法一章节. 原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=11735 更多内容可以参阅:h