单精度浮点数和有效位数为什么是7位

IEEE754标准 详细描述了单精度浮点数的格式 详查维基百科IEEE_754-1985  描述了包括如何表示( 规约化 非规约化 0 无穷 NAN)这几类以及为什么要如此表示

尾数位数越多,精度越高;指数位越多,可表示范围越大。物理中常用有效数字来描述此概念。https://zh.wikipedia.org/wiki/%E6%9C%89%E6%95%88%E6%95%B0%E5%AD%97

单精度浮点数的有效位数为什么是7位,找到的答案如下:

浮点数的精度取决于尾数部分。尾数部分的位数越多,能够表示的有效数字越多。 

单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。

然而 还是不太明白为什么有效数位就是7位了。

“浮点数的精度取决于尾数部分。尾数部分的位数越多,能够表示的有效数字越多。”这句赞同,所以双精度的有效位数肯定比单精度的多。 

一个数如果有效位数大于7位 如1.27893456076(12位),用float来表示就不能准确的存储了。

运行:

float a = 1.23456789076f;// --->a = 1.2345679

即用1.23456789076在计算机中存储成float的格式只能逼近到第七位,

能不能准确存储还取决于这个数字(十进制数)能不能用有限的二进制位数准确的表示。float = 2.202  float = 2.25

时间: 2024-12-11 06:39:31

单精度浮点数和有效位数为什么是7位的相关文章

单精度浮点数

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

单精度浮点数按存储格式转为整数的程序

/////////////////// #include<cstdio> //----------------- union int_char { unsigned char ch[4]; float i; }; void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上. { printf("单精度浮点数值为:%f\n",x.i,x.i); printf("存储位置从左到右,从高位到低位依次为 0x

单精度浮点数操作

用数组存储32位单精度浮点数,并且实现有效位右移,有效数加法等,可用于计算机浮点加减法的底层模拟. 1 package com.computerOrganizationAndArchitecture.floatQperation; 2 3 import com.computerOrganizationAndArchitecture.singleprecisionfloat.SinglePrecision; 4 5 /** 6 * Created by XuTao on 2018/12/8 20:

线程暂停的方法、基本数据类型包装类、十进制单精度浮点数(32位)存入内存中、TreeSet和TreeMap

使线程暂停执行的方法? 1.Thread类的sleep()方法使线程进入阻塞状态,睡眠指定的时间段. 2.Object类的wait()方法使线程放弃对象锁,进入等锁池,直到获得对象锁后才继续往下执行 3.Thread类的yield()方法平时比较少用,使线程进入就绪状态而不是阻塞状态,也就是说下一个执行的线程可能还是这个线程,当然也可能让给了其他的线程,那么这个线程就暂停了. 4.Java5后的使用Lock接口也可以实现类似于对象锁的功能,优点是比较灵活.可以知道线程获得锁了没有等,比较大的缺点

单精度浮点数(float)加法计算出错

场景: 一个float型的变量赋值1170601,加上19000000,结果出现错误. 原因: float占用4个字节(32位)存储空间,包括符号位1位,阶码位8位,尾数23位.浮点数精度与它的尾数有关. 尾数为二进制小数1.m,m为23位的小数.所以浮点数的精度为24位二进制有效位数.2的24次方为16777216. 19000000 > 16777216,做加法计算之后丢失精度出错. 解决方法: 将float用double替换,double占用8个字节(64位)存储空间,包括符号位1位,阶码

C语言浮点数除法可以精确到多少位小数

double型的两个数相除,得到的浮点数能精确到多少位呢..用我家电脑做了个实验,编译器是Code::Blocks 13.12. 然后用电脑自带的计算器算的结果和C语言算的结果比较如图. 第一例里a=199000007,b=3030337,得到的答案在小数点后第14位(我没数错吧)开始不同了. 第二个例子里a=202033320333,b=1234567,在小数点后第11位开始不同了. 所以浮点数除法精确的位数是不固定的.

浮点数四舍五入到小数点后两位

#include<stdio.h> #include<math.h> double change(double n){ return round(n * 100) / 100; } int main(){ double n; while(scanf("%lf",&n)!= EOF){ printf("%.2f",change(n)); } return 0; } 即:将浮点数乘 100,求其四舍五入整数,然后除以100,便可得到 相对

从如何判断浮点数是否等于0说起——浮点数的机器级表示

本文很大程度上收到林锐博士一些文章的启发,lz也是在大学期间读过,感觉收益良多,但是当时林锐也是说了结论,lz也只是知其然,而不知其所以然,为什么要那样写?为什么要这样用?往往一深究起来就稀里糊涂了,现在有幸还是继续读书,我发现了很多问题理解的还不透彻,亡羊补牢. 比如:有int d;  int *d; bool d; double d:几个变量,经过一系列的计算之后,那么去判断这个四个变量是否等于0该怎么做? 很多菜鸟或者编程功底不扎实的就会出错,一些烂书,尤其国内的一部分大学教材,教授编程语

java浮点数剖析

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数.计算机系统采纳了所谓的浮点数表达方式.这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa也叫有效数字 ),一个基数(Base),一个指数(Exponent)以及 一个表示正负的符号来表达实数.浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数. 当一个浮点数的尾数为0,不论其阶码为何值,该浮点数的值都为0.当阶码的值为它能表示的最