float和double类型的存储方式

Float double 类型在计算机的存储方式

计算机中只认识10的二进制数,那么该如何存储小数呢?

那么我们先看Floa类型:

Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0为正,1为负 第2到第9位为指数位,第10到32位为尾数位,具体地如下图所示:


1


2


9


10


32

现在我们举个例子:

8.25的二进制表示方法为:1000.01 =1.00001*23 ,指数为3,尾数为00001,那么它怎样在二进制中存储呢?

首先看符号位为正,所以第一位为0,指数为3,要加上127=130,130的二进制数是1000 0010 填到第二到第九位中,最后的尾数部分就为0000 1 尾数后面的空余部分补0.


0


1


0


0


0


0


0


1


0


0


0


0


0


1


0


0


0


0


0


0


0


0


0


0


0


0


0


0


0


0


0


0

表示为十六进制就是41040000,那么究竟对不对呢?我们用程序跑一下就知道了:

可以看到结果是正确的。

同理double型也是同样的道理,只不过符号位是1位,指数位为11位,尾数位为52位,当计算指数时,要用指数加1023,然后转换成二进制。

下面说下取值范围和精度:

取值范围看指数部分:

float是有符号型,其中,8位指数位,2^8=(-128—127),因此实际的范围是-2^128—2^127,约为-3.4E38—3.4E38

同理double范围约是-1.7E308—1.7E308,

精度是看尾数部分:

float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位

double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位

float和double类型的存储方式,布布扣,bubuko.com

时间: 2024-12-26 05:47:36

float和double类型的存储方式的相关文章

float及double类型减法运算时精度丢失问题

当float和double类型在进行减法运算时,会出现精度丢失问题,这种问题主要是由于计算机中普遍使用2进制所造成的.在此做为记录,防止日后遗忘.     public static void main(String[] args) {         float a = 2.1f;         float b = 2.0f;         float c = a - b;         System.out.println("a-b=" + c);     }     //输

C语言之变量类型和存储方式

变量可以分为全局变量.静态全局变量.局部变量和静态局部变量 变量的声明有两种情况: 1.一种是需要建立存储空间的(定义性声明).例如int a 在生命的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的(引用性声明).例如extern int a 其中变量a是在别的文件中定义的. 内存区域的划分: 1.栈区:由编译器自动分配和释放的内存区域,用于存放函数的参数值.局部变量等. 2.堆区:程序员向系统申请或释放. 3.全局区:用来保存全局变量和静态变量. 4.文字常量区:用来保存常量字符

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

Android的资源类型和存储方式简介-android学习之旅(五十二)

android资源的类型 android资源的存储方式

float与 double型数据存储---IEEE浮点数表示法

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算. 这种结构是一种科学计数法,用符号.指数和尾数来表示,底数定为2--即把一个浮点数表示为尾数乘以2的指数次方再添上符号.下面是具体的规格:               符号位     指数部分    尾数       长度float           1             8              23          32double       1            11      

C语言:自己动手查看float以及double类型的变量2.5在内存中的存储方式。

编写如上图程序.Fn与F10进调试界面:选择如下操作进入内存1查看内存 分别输入&a,&b查看内存: 举例float float a = 2.5 10.1 = 1.01 *2 ^1; 符号位 为0: 指数位8位,为127 + 1= 128 =1000 0000: 位数位23位,为0100  0000  0000 0000  000: 32位二进制数位为 0100   0000    0010    0000  0000 0000  0000 地址为40200000

C类型和存储方式的语言变量

变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能够与1中的变量重名,在复合语句作用域中里面定义的变量权限更高,考虑到可读性不推荐这么做 比如: #include<stdio.h> #include<stdlib.h> void fun1(); int main() { fun1(); } void fun1() { int m=20

java float跟double类型区别

单精度和双精度的取值范围和精度是不同的 单精度:float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间 双精度:double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间. 原文地址:https://www.cnblogs.com/mileSs/p/8386968.html

java中如何使用BigDecimal使得Double类型保留两位有效数字

一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.919999999999999... 二.原因: java mysql 数据类型对照如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR