float与double类型区别比较

DECIMAL FLOAT 比较 目录 一:一般Java程序中 二:DB2中的单双精度 (1)定义 (2)精确性 (3)性能优势 一:一般Java程序中 Double Float区别:   01.在内存中占有的字节数不同     单精度浮点数在机内存占4个字节     双精度浮点数在机内存占8个字节   02.有效数字位数不同     单精度浮点数有效数字8位     双精度浮点数有效数字1... 阅读详情

参考或转自http://topic.csdn.net/u/20090716/10/CE4A7037-3C0D-40AE-AF85-F702C78FCEA3.html

单精度浮点数在机内占4个字节,用32位二进制描述。

双精度浮点数在机内占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 32 6-7 -3.4*10(-38)~3.4*10(38) 
double 64 15-16 -1.7*10(-308)~1.7*10(308) 
long double 128 18-19 -1.2*10(-4932)~1.2*10(4932) 
简单来说,Float为单精度,内存中占4个字节,有效数位是7位(因为有正负,所以不是8位),在我的电脑且VC++6.0平台中默认显示是6位有效数字;double为双精度,占8个字节,有效数位是16位,但在我的电脑且VC++6.0平台中默认显示同样是6位有效数字(见我的double_float文件) 
还有,有个例子:在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就没事了。 
本人通常的做法,经常使用double,而不喜欢使用float。

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

    无论是单精度还是双精度在存储中都分为三个部分:

  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
  3. 尾数部分(Mantissa):尾数部分

其中float的存储方式如下图所示:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

而双精度的存储方式为:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

     R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客,而120.5可以表示为:1.205*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客, 这些小学的知识就不用多说了吧。而我们傻蛋计算机根本不认识十进制的数据,他只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数 法表示,8.25用二进制表示可表示为1000.01,我靠,不会连这都不会转换吧?那我估计要没辙了。120.5用二进制表示为:1110110.1用 二进制的科学计数法表示1000.01可以表示为1.0001*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客,1110110.1可以表示为1.1101101*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客,任何一个数都的科学计数法表示都为1.xxx*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客, 尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点, 24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以 指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。

     首先看下8.25,用二进制的科学计数法表示为:1.0001*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

而单精度浮点数120.5的存储方式如下图所示:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

那么如果给出内存中一段数据,并且告诉你是单精度存储的话,你如何知道该数据的十进制数值呢?其实就是对上面的反推过程,比如给出如下内存 数据:0100001011101101000000000000,首先我们现将该数据分段,0 10000 0101 110 1101 0000 0000 0000 0000,在内存中的存储就为下图所示:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

根据我们的计算方式,可以计算出,这样一组数据表示为:1.1101101*C++中,float double区别 - sunwenhua168 - sunwenhua168的博客=120.5

而双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数。所以这里不再详细的介绍双精度的存储方式了,只将120.5的最后存储方式图给出,大家可以仔细想想为何是这样子的

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

下面我就这个基础知识点来解决一个我们的一个疑惑,请看下面一段程序,注意观察输出结果

            float f = 2.2f;

            double d = (double)f;

            Console.WriteLine(d.ToString("0.0000000000000"));

            f = 2.25f;

            d = (double)f;

            Console.WriteLine(d.ToString("0.0000000000000"));

可能输出的结果让大家疑惑不解,单精度的2.2转换为双精度后,精确到小数点后13位后变为了2.2000000476837,而单精度的 2.25转换为双精度后,变为了2.2500000000000,为何2.2在转换后的数值更改了而2.25却没有更改呢?很奇怪吧?其实通过上面关于两 种存储结果的介绍,我们已经大概能找到答案。首先我们看看2.25的单精度存储方式,很简单 0 1000 0001 001 0000 0000 0000 0000 0000,而2.25的双精度表示为:0 100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的,而我们再看看2.2呢,2.2用科学计数法表示应该为:将十进制的小数转换为二进制的小数 的方法为将小数*2,取整数部分,所以0.282=0.4,所以二进制小数第一位为0.4的整数部分0,0.4×2=0.8,第二位为0,0.8*2= 1.6,第三位为1,0.6×2 = 1.2,第四位为1,0.2*2=0.4,第五位为0,这样永远也不可能乘到=1.0,得到的二进制是一个无限循环的排列 00110011001100110011... ,对于单精度数据来说,尾数只能表示24bit的精度,所以2.2的float存储为:

C++中,float double区别 - sunwenhua168 - sunwenhua168的博客

但是这样存储方式,换算成十进制的值,却不会是2.2的,应为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数 据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题,对于能够用二进制表示的十进制数据,如 2.25,这个误差就会不存在,所以会出现上面比较奇怪的输出结果。

参考: http://hi.baidu.com/kathyxiami/item/a2a9f28b9ff05d52e73d197c
细节:基本数据类型floatdouble区别 一、两者定义 float:单精度浮点数 double:双精度浮点数 二、两者的主要区别   01)在内存中占有的字节数不同     单精度浮点数在机内存占4个字节     双精度浮点数在机内存占8个字节   02)有效数字位数不同     单精度浮点数有效数字8位     双精度浮点数有效数字16位   03)数值取值范围     单精度浮点数的表示范围:-3.40E+38~3.40E+38     双精度浮点数的表示范围:-1.79E+308~-1.79E+308   04) 阅读详情

相关推荐

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1081

doublefloat区别

也是一个不错的选择。具体选择哪种类型,需要根据实际情况和需求来决定。但如果对精度要求不高,且希望节省内存空间,那么使用。因此,在需要高精度和大范围的场合,应优先考虑使用。

我的博客 1万+

c语言floatdouble 类型区别

这意味着在进行数值计算时,超过这个有效数字位数的部分可能会丢失精度。:由于其只有 32 位,所能表示的数值范围相对较小。:当对精度要求不高,并且需要节省存储空间或者追求更高的存储效率时,可以使用。:由于占用的存储空间小,在一些早期的硬件或者对计算资源要求较高的场景中,:在需要高精度计算的场景中,如科学计算、金融计算等领域,通常会选择。类型快,因为处理 32 位数据相对 64 位数据需要的资源更少。:有 64 位,它的指数部分位数更多,因此能够表示的数值范围比。:在现代计算机硬件中,由于 CPU 的优化,

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 1183

C语言中,floatdouble区别及用法

使用场景:一般情况下,如果需要高精度计算,应该使用double;需要注意的是,在进行浮点数运算时,由于浮点数存在精度问题,可能会出现一些意料之外的结果,因此需要谨慎使用。运算速度:如果需要快速进行浮点数运算,可以使用float,因为它占用的存储空间更小,运算速度更快。精度要求:如果需要高精度计算,应该使用double,因为它能够表示更小精度的数值。存储空间:如果需要节省存储空间,可以使用float,因为它占用的存储空间更小。精度:doublefloat精度更高,能够表示更大范围和更小精度的数值。

顾得泉的博客 2万+

float型和double型的区别

float型和double型的区别

kim的博客 1万+

java float double 区别_Java中的doublefloat基本类型比较

如果我们将floatdouble.5或.0或.1235(以5或0结尾)进行比较,则==运算符将返回true,否则将返回false。请参见以下示例。示例publicclassTester{publicstaticvoidmain(String[]args){doubled1=2.5;floatf1=2.5f;System.out.println(d1==f1);...

weixin_42098759的博客 362

在C语言编程中double,C语言doublefloat区别

C语言doublefloat区别发布时间:2020-06-09 10:06:12来源:亿速云阅读:206作者:Leah这篇文章给大家分享的是C语言doublefloat区别。小编觉得挺实用的,因此分享给大家学习。我们先来看看C语言double代表的意思。double是C语言的一个关键字,代表双精度浮点型,占8个字节内存空间,其数值范围为“1.7E-308~1.7E+308”,双精度完...

weixin_35779001的博客 1万+

Java中floatdouble区别用法解析

Java中floatdouble区别用法解析

道友 1833

C++中floatdouble区别和联系

C++中的floatdouble均为浮点类型,但存在显著差异:float为4字节单精度,提供约6-7位有效数字;double为8字节双精度,精度达15-16位。double数值范围更大,精度更高,现代CPU中性能接近float但更稳定。默认浮点字面量为doublefloat需加f后缀。建议优先使用double以确保精度,仅在存储受限或大量数据时选用float

Tipriest的博客 1366

BigDecimal解决精度丢失

相同数值的doublefloat类型比较结果为false float f1 = 0.2f; double d1 = 0.2d; System.out.println(f1 == d1); System.out.println((float)d1); System.out.println((double)f1); 输出结果 false 0.2 0.20000000298023224 我们知道计算机是以二进制进行存储数据,当我们传入10进制的小数时,计算机会将十进制的小数转换为二进制的小数,但是有些小数不

繁星呀 1044

Java-各种类型的等于比较

Integer、Long、FloatDouble、BigDecimal、String 等于的比较方式 public static void main(String[] args) { intCompare(); longCompare(); floatCompare(); doubleCompare(); bigDecimalCompare(); stringCompare(); } public static void intCompare() { int int1 = 1; int

zym_1321的博客 294

oraclegbase8s迁移数据类型对照

定点数和浮点数是计算机表示数据的两种不同方式。定点数的小数点位置在计算机的存储中是约定好的,这意味着小数位为固定十进制数,而浮点数的小数位则随2的几次幂的大小而浮动。例如,8位定点数可以表示的范围是-16.00~15.875,其最大精度为0.125。将浮点数转换为定点数的操作包括:首先计算 b = a * 2^F(a为浮点数,F为小数部分字长),然后将b化为整数,最后用二进制将b表示成c。这种转换方法在可以接受精度损失的前提下,有可能提高运算效率。

克克克克业业的学习记录 2947

java不同类型之间的equal比较_==equal的区别

一、java中的数据类型html基本类型:如:int、short、long、floatdouble、boolean引用类型null类型:这是一个很是特殊的类型二、基本类型之间的比较java你们都知道基本之间的类型比较不能用equal,而是用==,那么用==是怎么比较大小的呢?咱们就来探一个究竟。面试在计算机中,全部储存的东西都是用二进制来表示的,例如:01010101010101,那么基本类型在...

weixin_39831493的博客 556

==equal的区别

1、java中的数据类型 基本类型:如:int、short、long、floatdouble、boolean引用类型null类型:这是一个非常特殊的类型 2、基本类型之间的比较 大家都知道基本之间的类型比较不能用equal,而是用==,那么用==是怎么比较大小的呢?我们就来探一个究竟。 在计算机中,所有储存的东西都是用二进制来表示的,例如:01010101

未之奋豆 418

Java中关于浮点数的算术运算出现精度丢失及Java 浮点数大小比较,JAVA中的floatdouble区别

Java 浮点数大小比较,浮点数计算精度丢失问题,JAVA中的floatdouble区别

忆往昔的博客 2756

Java基本数据类型比较

一、byte, short, int, long四种基本数据类型以及其包装类的比较: int i = 100; Integer i1 = 100; Integer i2 = 100; Integer i3 = new Integer(100); Integer i4 = new Integer(100); Int

xiaozhidexiao的博客 2413

Java中类型比较

需要注意的是,引用类型的“==”运算符和“equals()”方法的比较含义是不同的。前者比较的是两个引用变量所指向的对象在内存中的地址是否相同,而后者则一般在类的定义中进行重写,比较的是两个对象的内容是否相同。当没有重写“equals()”方法时,“equals()”方法调用的是Object类中默认实现的比较方法,其行为“==”运算符相似,即比较两个引用类型变量所指向的对象在内存中的地址是否相同。而对于引用类型比较,其比较的是变量所引用的对象的内存地址是否相同。反之,它们则被视作不相等的对象。

m0_71461928的博客 134

java(4)——数据类型中的数值型的浮点数

浮点数分为doublefloat,大小分别为8字节和4字节。 在java里的float要在末尾加F,因为浮点型默认是double类型的数 public class VarTest{ public static void main(String[] args){ double num0 = 323E-1 ; System.out.println(num0) ; //double float num1 = 1.221432423423F ; System.out.println(num

weixin_48445640的博客 249

视觉媒体通信作业记录(六)端到端的视频传输系统

将采集、编码、传输、显示各模块连接起来,形成一个端到端的视频通信系统,开发一个特色模块,将其加入系统;

weixin_45774698的博客 1940

AirSim无人机仿真自定义模型 Matrice200 无人机模型下载

根据 Matrice200 无人机三维模型修改而来,压缩包里面包含三个文件,分别是机身FBX模型,左后方螺旋桨模型(亦为右前方),右后方螺旋桨模型(亦为左前方),只需在UE4里面导入模型(需要勾选组合模型选项),使用AirSim默认飞行器蓝图进行部件替换即可,具体操作可以参考博文。此资源仅限学习交流使用,严禁将其用于商业领域,请尊重原始创作者。

上一篇: 函数返回值为指针的问题
下一篇: C++ vector容器类型
godenlove007
博客等级 码龄16年 338粉丝 29原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值