精华内容
下载资源
问答
  • 在C语言中,单精度浮点数(float)和双精度浮点数(double)类型都是用来储存实数的,双精度是用记忆较多,有效数字较多,数值范围较大。
  • 浮点数存储处理      C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。单精度类型和双精度类型在计算机存储格式如下所示: ...

    浮点数如何存储

         C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。单精度类型和双精度类型在计算机存储格式如下所示:
    在这里插入图片描述

    图1 浮点类型的数据的存储格式

         要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:

          举个例子:78.375,是一个正小数。要在计算中存储这个数,需要把它表示为浮点数的格式,先进行二进制转换(ps:二进制的小数点和十进制的小数点是不同的。二进制小数点后是2的负幂,十进制是10的负幂):

    一、小数的二进制转换(浮点数)

         78.375的整数部分:
    (78)10=(1001110)2

         78.375的小数部分:
    (0.375)10 = 3/8 = 1/4+1/8 = 2-1+2-3 = (0.01)2+(0.001)2 = (0.011)2

    所以,78.375的二进制形式就是1001110.011
    然后,使用二进制科学计数法,则有
    (78.375)10 = (1001110.011)2 = 1.001110011 ×26
    注意,转换后用二进制科学计数法表示的这个数,有底数、有指数、有小数,称为浮点数。

    二、浮点数在计算机中的存储

         在计算机中,保存这个数使用的是浮点数表示法,分为三大部分,如图2所示:

         第一部分用了存储符号位(sign),用来区分正负数,这里是0,表示正数;

         第二部分用来存储指数(exponent),这里的指数是十进制的6;

         第三部分用来存储小数(fraction),这里的小数部分是001110011;
    注意:指数也有正负之分。
    在这里插入图片描述

    图2 浮点数在计算机中的存储格式

    1.单精度表示法

          Float类型的32位单精度表示如下:

         符号位(sign)占用1位,用来表示正负数,

         指数位(exponent)占用8位,用来表示指数,

         小数位(fraction)占用23位,用来表示小数,不足位数补。

    在这里插入图片描述

    2.双精度表示法

         Float类型的64位单精度表示如下:

         符号位(sign)占用1位,用来表示正负数,

         指数位(exponent)占用11位,用来表示指数,

         小数位(fraction)占用52位,用来表示小数,不足位数补。
    在这里插入图片描述

         总结:指数位决定了大小范围,因为指数位数越大,则表示的数越大;而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大。

    三、指数位的偏移量与无符号表示

         需要注意的是指数可能是正数如78.375,也可能是负数,如0.0375,即指数是有符号整数,而有符号整数的计算要比无符号整数计算麻烦,所以为了减少不必要的麻烦,在实际存储指数时,需要把指数转为无符号整数。转换过程如下:

         注意到float的指数部分是8位,则指数的取值范围是-126到+127,为了消除负数带来的实际计算上的影响(比如比较大小、加减法等),可以在实际存储时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量位127,这样就不会有负数出现了。

         • 比如指数如果是6,则实际存储的是6+127 = 133,即把133转换为二进制后再存储;

         • 指数如果是-3,则实际存储的是-3+127 = 124,即把124转换为二进制再存储;

         • 当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。

         • 对于double类型,存储的时候指数偏移量是1023。

    最后

         所以用float类型来保存十进制小数78.375,需要先得到符号位、指数位和小数部分。这个例子前面已经分析过,所以:

         符号位为0;

         指数位为6+127=133,二进制表示为10 000 101;

         小数部分是001110011,不足部分自动补0;

         连起来用float表示,加粗部分是指数位,最左边是符号位0,代表正数:

    0 10000101 001110011 00000 00000 0000

         如果用double来存储,符号位和最后0的个数有变化,需要注意。
    在这里插入图片描述

    展开全文
  • 什么是双精度浮点数

    千次阅读 2021-05-23 02:07:56
    问题一:什么是单、双精度浮点数浮点就是小数点位置不确定,比如123.43,6557.521.在C语言中,一般单精度数据类型比如int,数据的范围是2的31次方,而双精度类型的整型比如long int的数据范围是2的63次方.所以双精度和单...

    问题一:什么是单、双精度浮点数浮点就是小数点位置不确定,比如123.43,6557.521.在C语言中,一般单精度数据类型比如int,数据的范围是2的31次方,而双精度类型的整型比如long int的数据范围是2的63次方.所以双精度和单精度主要的区别在于数据的范围大小.

    通俗的讲

    双精度的精度比单精度高

    表示的小数点后的位数多

    比方说单精度能最小表示到0.01

    双精度就能表示到0.0001

    以上只是例子,实际的精度不是这样,具体到多少记不大清楚了

    问题二:什么叫单精度浮点型?什么叫双精度浮点型?单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。

    double float数据类型,计算机中表示实型变量的一种变量类型。此数据类型与单精度数据类型(矗loat)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,通常情况,单精度浮点数占4字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,;双精度型占8

    个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。

    问题三:C语言中单精度浮点数和双精度分别如何表示?有什么差别?类型 比特数 有效数字 数值范围 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 double128 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

    问题四:浮点数的单精度和双精度是什么意思?高级语言的简单数据类型的一种,单精度浮点数占据32位二进制,1位为符号位,0代表正数,1代表负数,8位指数位,即指数可以达到10进制数据的2的8次方,尾数23位,即尾数可以达到2的23次方。

    问题五:什么叫单精度浮点型和双精度浮点型就是精确度,比如float就是精确到小数点后面4个日双精度double精确到小数点后面8个0。。

    问题六:双精度浮点数在C语言中是什么意思?就是double型啊.单精度浮点数float是32位,double则是64位,位数多,精度当然越大.具体到浮点数结构,你随便一搜就有了,我要说也顶多是胆网址贴过来.

    问题七:单精度float 和双精度double到底是什么区别啊单精度实数在内存中占32bit 有效数字为6~7位

    双精度实数占内存单元为64bit 有效数字为15~16位

    没有说明时,实型常量是作为双精度处理的,若要使用单精度需在后面加上字母f或F,如123.45f

    问题八:c语言分别定义一个单精度和一个双精度的浮点数float a;//单精度

    double b;//双精度

    问题九:单精度浮点和双精度浮点有什么区别如同字面, 就是表示精度的区别。双精度浮点数使用8个字节表示,有大约16位十进制有效数字。而单精度饥点数使用4字节,只有7位十进制有效数字。PS. Titan并没有阉割双精度性能,它在驱动中是有个开关的,打开后提供完整的双精度性能,但显卡会略微降频运行,实际峰值DP计算速度1.3TFlops。

    展开全文
  • 双精度浮点数double

    千次阅读 2019-03-09 12:28:24
    比起单精度浮点数,双精度浮点数(double)使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进位制的15或16位有效数字。 sign bit(符号): 用来表示正负号 exponent(指数): 用来表示次方数 mantissa(尾数): 用来...

    double类型介绍

    双精度浮点数(double)是计算机使用的一种数据类型。比起单精度浮点数,双精度浮点数(double)使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进位制的15或16位有效数字。


    sign bit(符号): 用来表示正负号
    exponent(指数): 用来表示次方数
    mantissa(尾数): 用来表示精确度

    注意这里的尾数只有52位,实际上能够存储53位。这里面有一个规格化的过程。

    为了最大限度提高精确度,可以要求尾数规范化,把尾数处理到大于等于1而小于2的区间内,便可省去前述的“1”。

    例如11.101 x 21011 规范化为1.1101 x 21101 ,存储尾数只须存储1101即可。
    所以能够精确表示的最大整数是253 -1(9007199254740991)

    c语言double类型的输入输出

    double a;
    scanf("%f",&a);   //应用scanf("%lf",&a);
    

    执行上面语句时,发现double类型的输入不能使用%f进行输入,得用%lf才能正常得到a的值。
    而在输出double类型时却可以用%f,这是因为printf("%f",a);在执行时C自动将float型的参数转换成double型。

    故double型的输入输出形式如下:

    double a;
    scanf("%lf",&a);
    printf("%f",a);
    printf("lf",a);//都可以
    

    综上:

    1. 用 scanf() 函数输入 double 类型的变量时,转换说明中的转换字符(占位符)只能用 lf,即%lf,写成 %f 无法正确输入double型数据;
    2. 用 printf() 函数输出 double 类型的变量时,转换说明中的转换字符(占位符)可用%lf 或%f,皆能正确输出,且输出结果一致。
    3. 为简单与一致性起见,在对 double 类型的变量输入输出时,建议都用%lf 占位符。

    参考:
    https://en.wikipedia.org/wiki/Double-precision_floating-point_format
    https://zh.wikipedia.org/wiki/雙精度浮點數
    https://blog.csdn.net/u011415955/article/details/37322587
    https://blog.csdn.net/clxjoseph/article/details/8731363

    展开全文
  • 此文章描述了如何将十进制小数转换为二进制小数以及浮点数再内存中时如何进行存储。 二进制小数 在计算机中,无论什么数据,最终存储都为二进制,对于整数部分很容易表示,但是对于非整数则比较困难。例如,十进制数...

    前言

    对于十进制的整数使用二进制表示很简单,但是对于十进制小数如何使用二进制进行存储?十进制的小数又何如使用二进制小数表示?此文章描述了如何将十进制小数转换为二进制小数以及浮点数再内存中时如何进行存储。

    二进制小数

    在计算机中,无论什么数据,最终存储都为二进制,对于整数部分很容易表示,但是对于非整数则比较困难。例如,十进制数0.125可表示为二进制0.001,怎么得来的?简单的计算可以用0.125不断乘2,结果小于1将二进制位记为0,结果大于1时将二进制位记为1

    0.125 * 2 = 0.25  二进制位记作 0
    0.25  * 2 = 0.5   二进制位记作 0
    0.5   * 2 = 1     二进制位记作 1
    

    所以得出结果为0.001

    另外可以把可以把十进制数0.125看做1/2/2/2 = 1*2^-3,十进制1换算为二进制还为1,二进制的负指数则相当于二进制数1右移位,用2的指数记为2^-3

    上面的例子因为能够用2的指数表示,所以能够被二进制精确的表达,但是有些情况,则无法使用二进制准确表达,例如一个人尽皆知的例子:十进制数0.1如何使用二进制表达?你会发现你无法用2的指数去表达它,即使用我们上面的计算方法:

    0.1   * 2 = 0.2  二进制位记作 0
    0.2   * 2 = 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
    0.4   * 2 = 0.8  二进制位记作 0
    0.8   * 2 = 1.6  二进制位记作 1
    ...
    

    你会发现,它会无穷无尽的循环0.0001100110011...,这便是为何无法使用二进制数精确表达十进制小数。类似于使用十进制数也无法精确表达,永远是0.33333333...

    浮点数

    浮点数是相对于定点数而言的。
    十进制数1234用科学计数法可写作:1.234*10^3,类似的,可用二进制表示为‭0.10011010010*2^11‬,我们称10011010010为尾数(mantissa/fraction),2称为基数(Radix),11则称之为指数(Exponent)。如此,小数点的位置根据指数的不同而浮动,称为浮点数。

    那么在内存中,是如何使用二进制表示小数?IEEE_754对此进行了标准化。

    单精度浮点数(Float)

    单精度浮点数的存储使用32位二进制数,最高位31是符号位,用来表示正负数,23-30存储指数,低位0-22存储尾数。
    需要注意的是,指数位的存储有两种方式:

    • 一种为有符号整数,意为有1位用来存储是正指数还是负指数。
    • 另外一种情况存储为无符号整数,使用指数偏移量来计算是正指数还是负指数,例如,单进度浮点数的指数偏移量为127,意味着所存储的指数需要减去127,得出的结果便是正确的指数。

    另外关于尾数的存储,在正规数(normal numbers)的情况下,二进制小数的表示总是以1.x开头,例如二进制数1001会表示为1.001*2^3而不是0.1001*2^40.01001*2^5。这在存储时则可省略开头的1,上面的1001则可存储为001且指数为3

    我们看一个具体的例子:十进制数0.15625

    符号(Sign):0
    指数(Exponent):偏移量计算方法,实际上我们应当存储的是-3指数,
                    用偏移量则为 127 - 3 = 124 转换为二进制为 0111 1100‬
    尾数(Fraction):按照上面的十进制小数计算二进制小数得出0.00101 = 1.01 * 2^-3,
                    去除前导1和指数得出尾数 = 01
    

    双精度浮点数(Double)

    双精度浮点数的计算类似于单精度浮点数,只不过存储大了一倍,它使用64位二进制数进行存储,与单精度浮点数相似,最高位63是符号位,用来表示正负数,52-62存储指数,低位0-51存储尾数,它的指数偏移为1023

    其它值

    无论是单精度还是双精度浮点数,都存在一些特殊的值,例如次正规数(subnormal numbers)和0以及±无穷大的数,还有无法正确转换的值NaN

    结尾

    精度越高的存储所需要的存储空间是越大的,当尾数过大无法存储时,根据IEEE_754标准进行丢失精度的舍入。

    Reference

    展开全文
  • 单精度浮点数和双精度浮点数Here you will learn about difference between float and double i.e. float vs double. 在这里,您将了解float和double的区别,即float vs double。 These are two commonly used ...
  • 单精度浮点数与双精度浮点数区别

    万次阅读 2020-04-06 15:14:35
    双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,阶码11位,尾数52位。 2、所存的数值范围不同 单精度浮点数的数值范围为-3.4E38~3.4E38,而双精度浮点数可以表示的数字的绝对值范围...
  • 浮点数在计算机中的存储十进制浮点数格式:浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分。比如 3.684*10^2. 在十进制中,指数的...
  • 浮点数在计算机中的存储十进制浮点数格式:浮点数格式使用科学计数法表示实数。科学计数法把数字表示为系数(coefficient)(也称为尾数(mantissa)),和指数 (exponent)两部分。比如 3.684*10^2. 在十进制中,指数的...
  • 计算机程序中的浮点数分为单精度浮点数和双精度浮点数。单精度和双精度精确的范围不一样。计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。稍大一点的单位是字节(Byte,简写为B)。再大一级的是千...
  • 浮点数详解
  • 1809: 输入一个双精度浮点数,保留12位小数输出 #include<stdio.h> int main() { double a; scanf("%lf", &a); printf("%.12lf\n", a); return 0; }
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。 浮点型 浮点型浮点型别给我整些花里胡哨的定义,浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是...
  • JS中使用IEEE-754规定的双精度浮点数,所有的算法也都符合IEEE-754规定的双精度浮点数运算。 双精度浮点数是一种64位(64 bit)的二进制数字格式。包括3个组成部分: 符号位 1位 阶码(指数部分) 11位 尾数(有效数...
  • matlab默认以64位双精度浮点格式存储数据于工作空间(workspace),第0位到第51位为小数部分,第52位到62位为指数部分,第63位为符号(正或负)部分。从排列组合的角度考虑,共有64位,每个位有0和1两种状态,因此64...
  • 8字节16进制转双精度浮点数 前言 一、JS处理32位整型位运算? 示例:在JS中无论是整数还是小数都是按照64位的浮点数形式存储,而整数运算会自动转化为32位有符号整数。 有符号整数使用 31 位表示整数的数值,用第...
  • 一、复习10进制转2进制1)整数部分:除2取余,逆序2)小数部分:乘2取整,正序在线工具二、了解IEEE 754双精度浮点数规范1) 通过2进制的科学计数法存储。和10进制的科学计数法类似,二进制的科学技术法格式为1.xxx*2^N...
  • 大端存储和小端存储的区别
  • S7-200SMART 双精度浮点型数据转换为单精度浮点型的方法
  • 单精度浮点数(float)与双精度浮点数(double)的区别如下: (1)在内存中占有的字节数不同 •单精度浮点数在机内占4个字节 •双精度浮点数在机内占8个字节 (2)有效数字位数不同 •单精度浮点数有效数字8位...
  • 在默认情况下,Matlab浮点计算产生的结果总是以64比特位存储双精度浮点数。 但是该双精度数是否显示和如何显示,可以根据需要进行控制。是否显示: 控制符是“分号 ; ”phi10 = 10*(1 + sqrt(5))/2; %不显示 phi...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,805
精华内容 17,522
关键字:

双精度浮点数存储