精华内容
下载资源
问答
  • C语言中,单精度浮点数(float)和双精度浮点数(double)类型都是用来储存实数的,双精度是用记忆较多,有效数字较多,数值范围较大。
  • 计算机程序中的浮点数分为单精度浮点数双精度浮点数。单精度和双精度精确的范围不一样。计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。稍大一点的单位是字节(Byte,简写为B)。再大一级的是千...

    上节课简单介绍了浮点数。计算机程序中的浮点数分为单精度浮点数和双精度浮点数。

    单精度和双精度精确的范围不一样。

    计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。

    稍大一点的单位是字节(Byte,简写为B)。

    再大一级的是千字节(kilo Bytes),用k来表示。

    再大一级的单位是兆字节(Mega Bytes),用M来表示。一张照片的大小通常为1~3M。

    再大一级的单位为G。一部高清电影的大小通常为1~2G。

    再大一级的单位为T。

    换算关系为:

    1B = 8bit

    1k = 1024B = 2^10 B

    1M = 1024k = 2^20 B

    1G = 1024M = 2^30 B

    1T = 1024G = 2^40 B

    单精度(float)在计算机中存储占用4字节,32位,有效位数为7位(6位小数+小数点)。

    双精度(double)在计算机中存储占用8字节,64位,有效位数为16位(15位小数+小数点)。

    不管是float还是double,在计算机中的存储都遵循IEEE规范,使用二进制科学计数法,都包含三个部分:符号位、指数位和尾数部分。其中float的符号位、指数位(即整数部分)、尾数部分分别为1, 8, 23。双精度则分别为1, 11, 52。

    format,png

    float

    format,png

    double

    精度主要取决于尾数部分的位数,float为23位,最小为2的-23次方,约等于1.19乘以10的-7次方,所以float小数部分只能精确到后面6位,加上小数点算做一位,即有效数字为7位。

    类似,double 尾数部分52位,最小为2的-52次方,约为2.22乘以10的-16次方,所以精确到小数点后15位,有效位数为16位。

    程序验证:

    #include

    int main()

    {

    float a = 1.123456789;

    printf("a = %20.9f\n", a);

    double b = 2.123456789;

    printf("b = %20.9f\n", b);

    return 0;

    }

    注意:这里%20.9f表示浮点数总共有20位,其中小数占9位。不足20位的部分,左侧用空格来填充。

    运行结果:

    a = 1.123456836

    b = 2.123456789

    从运行结果可以看出,单精度浮点数小数部分只有前6位是准确的,后三位是不准确的。双精度小数部分9位都是准确的。

    展开全文
  • 小数点分为整数部分和小数部分,它们之间用点分隔. 例如,0.0、75.0、4.023、0.27,-937.198 -0.27等都是合法的小数.... 任何十进制数字都可以用指数形式表示.C语言支持两种十进制形式. 但是在撰写本文时,C...

    5-810-jpg_6-1080-0-0-1080.jpg

    小数点分为整数部分和小数部分,它们之间用点分隔. 例如,0.0、75.0、4.023、0.27,-937.198 -0.27等都是合法的小数. 这是最常见的小数形式. 这称为十进制形式.

    此外,十进制数也可以采用指数形式,例如7.25×102、0.0368×105、100.22×10-2,-27.36×10-3等. 任何十进制数字都可以用指数形式表示.

    C语言支持两种十进制形式. 但是在撰写本文时,C语言的指数形式不同于数学形式.

    C语言中小数的指数形式为:

    aEn或aen

    a是尾数部分,是十进制数字; n为指数部分,为十进制整数; E或e是用于分隔尾数部分和指数部分的固定字符. 整个表达式等于a×10n.

    指数形式的小数示例:

    在C语言中,通常使用两种类型的小数,即float或double. float被称为单精度浮点类型,double被称为双精度浮点类型.

    与整数不同,小数没有太多的飞蛾,小数的长度是固定的,浮点数始终占用4个字节,双精度数始终占用8个字节. 十进制输出小数也可以使用printf函数输出,包括十进制形式和指数形式,其对应的格式控制字符为:

    2014012623234440204.jpg

    以下代码演示了小数的表示形式和输出:

    #include

    #include

    int main()

    {

    float a = 0.302;

    float b = 128.101;

    double c = 123;

    float d = 112.64E3;

    double e = 0.7623e-2;

    float f = 1.23002398;

    printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f);

    return 0;

    }

    运行结果:

    a = 3.020000e-01

    b = 128.100998

    c = 123.000000

    d = 1.126400E + 05

    e = 0.007623

    f = 1.230024

    1-365-jpg_6_0_______-836-0-147-836.jpg

    代码说明:

    1)默认情况下,%f和%lf保留六个小数位. 少于6位数字用0填充,多于6位数字被舍入.

    2)将整数分配给float变量时,它变为小数.

    3)以指数形式输出小数时,输出结果为科学计数法;也就是说,尾数部分的值是: 0≤尾数<10.

    4)b的输出结果令人困惑,只有小数点后三位,为什么不能准确输出,但输出一个近似值?这与内存中小数的存储形式有关. 许多简单的小数位数无法准确存储,因此无法准确输出. 我们将在下一节“如何将小数存储在内存中,揭示诺贝尔奖级别的设计(详细地讲,请详细解释).

    此外,还有一种更智能的输出小数的方式,即使用%g. %g比较小数的十进制和指数形式,并以最短的方式输出小数,以使输出更简洁. 所谓的最短字符是输出最少的字符.

    %g用法示例:

    #include

    #include

    int main()

    {

    float a = 0.00001;

    float b = 30000000;

    float c = 12.84;

    float d = 1.229338455;

    printf("a=%g \nb=%g \nc=%g \nd=%g\n", a, b, c, d);

    return 0;

    }

    运行结果:

    d49f3e5b79114b07ac13da0800758134.gif

    a = 1e-05

    b = 3e + 07

    c = 12.84

    d = 1.22934

    每个小数点的分析:

    读者应注意的两点是:

    简而言之,%g应该以最短的方式输出小数,并且小数部分的行为自然,不加零c语言 float范围,并且比%f和%e更灵活,这在大多数情况下都符合用户习惯

    除%g外,还有%lg,%G,%lG: 后缀为数字的数字有默认类型: 对于整数,默认为int类型;对于整数,默认为int类型. 对于小数,默认为双精度类型.

    请参见以下示例:

    4-810-jpg_6-1080-0-0-1080.jpg

    long a = 100;

    int b = 294;

    float x = 52.55;

    double y = 18.6;

    两个数字100和294默认情况下为int类型. 将a分配为100时,您必须先将int转换为long,而不必将294转换为b.

    默认情况下,两个数字52.55和18.6的类型为double. 要将52.55分配给x,您必须先将double转换为float,然后将18.6分配给y而不进行转换.

    如果您不希望数字使用默认类型,则可以在数字后缀后手动指定类型:

    请参见以下代码:

    long a = 100l;

    int b = 294;

    short c = 32L;

    float x = 52.55f;

    double y = 18.6F;

    float z = 0.02;

    添加后缀. 尽管数字的类型已更改,但这并不意味着只能将数字分配给指定的类型. 只要执行类型转换,它仍然可以分配给其他类型.

    对于初学者来说,很少使用数字后缀. 无论是否添加它c语言 float范围,通常都相同,也不会影响实际编程,但是由于您已经学习了C语言,因此您仍然需要了解这一知识点. 代码是通过这种方式使用的,但是您不知道发生了什么,这很尴尬. 关于数据类型的转换,我们将在“ C语言数据类型转换”部分中深入讨论. 互相分配小数和整数在C中,可以互相分配整数和小数:

    请参见以下代码:

    #include

    int main(){

    float f = 251;

    int w = 19.427;

    int x = 92.78;

    int y = 0.52;

    int z = -87.27;

    printf("f = %f, w = %d, x = %d, y = %d, z = %d\n", f, w, x, y, z);

    return 0;

    }

    运行结果:

    f = 251.000000,w = 19,x = 92,y = 0,z = -87

    由于将十进制数分配给整数类型将被“扭曲”,因此编译器通常会发出警告以引起您的注意.

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/jisuanjixue/article-176452-1.html

    展开全文
  • C语言浮点数

    2021-05-24 01:18:16
    C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内....

    浮点数的概念

    浮点数也称小数或实数。例如,0.0、75.0、4.023、0.27、-937.198 都是合法的小数。这是常见的小数的表现形式,称为十进制形式。

    C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。

    在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值,例如7.0可能被储存为浮点值6.99999。

    点用内存的情况

    我们先来测试一下float、double和long double三种浮点数据类型占用内存的字节数。

    示例(book71.c)

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    浮点数的精度

    C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37。

    double类型和 float类型的最小取值范围相同,但至少必须能表示10位有效数字。

    long double,以满足比double类型更高的精度要求。不过,C只保证long double类型至少与double类型的精度相同。

    看了上面这段文字,估计大家有点晕,在之前的整数章节中,long比int的占用的内存多,存放数据的值也就越大,并且有一个准确的范围,但是,为什么各种浮点数存放数据的值怎么就这么模糊呢?我先不解释原因,浮点数的存储方式比较复杂,暂时不讨论,先用几个程序来测试一下它们的特征。

    1、测试float类型

    示例(book73.c)

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    从程序的运行我们可以看出float数的两个特征:

    float数据类型表达的是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到8位的时候,误差了1,基本上不能用了。

    2)用“==”可以比较两个整数或字符是否相等,但是,看起来相等的两个浮点数,就是不会相等。

    2、测试double类型

    示例(book74.c)

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    从程序的运行我们可以看出double数的两个特征:

    1)double数据类型表达的也是一个近似的数,不是准确的,小数点后的n位有误差,浮点数的位数越大,误差越大,到17位的时候,误差了1,基本上不能用了。

    2)用“==”可以比较两个double数值是否相等。

    3、测试long double类型

    示例(book75.c)

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    long double的测试结果与double相同。

    4、测试总结

    float只能表达6-7位的有效数字,不能用“==”判断两个数字是否相等。

    double能表达15-16位有效的数字,可以用“==”判断两个数字是否相等。

    long double和double的特征相同。

    在实际开发中,建议弃用float,只采用double就可以,long double暂时没有必要,但不知道以后的操作系统和编译器对long double是否有改进。

    浮点数的输出

    float采用%f输出,double采用%lf输出,测试结果证明,double也可以采用%f输出。

    long double采用%Lf输出,注意,L是大写。

    %lf缺省显示小数点后六位。

    如果要显示小数点后n位,用%.nlf,例如:

    double ff=7.5;

    %.2lf显示 7.50

    浮点数采用%lf输出,完整的输出格式是%m.nlf,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

    常用的库函数

    在接下来的内容中,我只介绍double,不再介绍float和long double两种数据类型相关的知识。

    以下是常用的浮点数函数,必须掌握。

    double atof(const char *nptr);       //把字符串nptr转换为double

    double fabs(double x);               //求双精度实数x的绝对值

    double pow(double x, double y);     //求 x 的 y 次幂(次方)

    double round(double x);              // double四舍五入

    double ceil(double x);                 // double向上取整数

    double floor(double x);               // double向下取整数

    double fmod(double x,double y);     //求x/y整除后的双精度余数

    double modf(double val,double *ip); //把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。

    还有一些数据计算函数,如正弦、对数、指数等,实际开发中极少使用,大家要用的时候再查资料,我就不介绍了。

    整数转换为浮点数

    我们先来看一个示例(book77.c):

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    需要特别注意的是dd=ii/jj这一行代码,dd的值0,不是0.75,有点意外,所以,如果对整数转换为浮点数没有把握,加(double)强制转换是个好办法。

    应用技巧

    浮点数有一些坑,例如两个浮点数不相等和精度的问题,在实际开发中,我们经常用整数代替浮点数,因为整数是精确的,效率也更高。

    例如人的身高一米七五,以米为单位,用浮点数表示是1.75米,如果以厘米为单位,用整数表示是175。

    long整数的取值是-9223372036854775808~9223372036854775807,有效数字是19位,而double的有效数字才15-16位,所以,整数可以表达的小数更大的数,更实用,麻烦也更少。

    货币:1.75元,如果采用0.01元为单位就是175,采用0.001元为单位就是1750,如果你说要更多小数怎么办?你这是钻牛角尖。

    给大家说一个道,高水平的程序员不容易掉坑里,注意,是不容易,不是一定不会,最好的方法是没有坑。

    科学计数法

    在实际开发中,我们很少使用科学计数法,但是它经常出现在计算机系统中,例如浮点数在内存中的存放方式就是科学计数法,所以我们还是有必要学习科学计数法。

    科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,n为整数),这种记数法叫做科学记数法。当我们要书写或运算某个较大或较小且位数较多时,用科学记数法免去浪费很多空间和时间。

    例如:51400000000=5.14×1011。计算器或电脑表达10的幂是一般是用E或e,也就是51400000000=5.14E11或5.14e11。

    用科学记数法表示数时,不改变数的符号,只是改变数的书写形式而已,可以方便的表示日常生活中遇到的一些极大或极小的数 。如:光的速度大约是300,000,000米/秒;全世界人口数大约是:6,100,000,000。

    这样的数,书写和显示都很不方便,我们可以免去写这么多重复的0,将其表现为这样的形式:6,100,000,000=6.1×109,即6.1E9或6.1e9。

    或:0.00001=1×10-5,即绝对值小于1的数也可以用科学记数法表示为a乘10 的负n次方的形式。即1E-5或1e-5。

    科学计数法采用%e或%E输出,完整的输出格式是%m.ne或%m.nE,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。

    示例(book78.c):

    6c1555302777729326ca3efa0910d9ec.png

    运行结果

    6c1555302777729326ca3efa0910d9ec.png

    课后作业

    编写示例程序,类似本章节的book71.c、book73.c、book74.c、book75.c、book77.c、book78.c,编译并运行它,记住,程序员是写出来的,不是看出来的,熟能生巧,你每天的付出都有意义。

    2、编写示例程序,测试浮点数赋值超过取值范围的后果。

    3、重写浮点数的常用库函数,实现其功能,函数的声明如下:

    以下作业建议在学完《数据类型转换》后再做,因为有知识点交叉。

    double FABS(const double x);            //求双精度实数x的绝对值

    double ROUND(const double x);         // double四舍五入

    double CEIL(const double x);             // double向上取整数

    double FLOOR(const double x);          // double向下取整数

    double MODF(double val,double *ip);    //把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。

    学习交流

    我建了一个QQ群701117364,有决心想学习的人可以加入,群中有学习资源,也欢迎高手加入。

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

    千次阅读 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。

    展开全文
  • 浮点数和十六进制数的相互转换,包括:1.单精度浮点数(32位)和十六进制数的相互转换,2.双精度浮点数(64位)和十六进制数的相互转换。
  • 展开全部double,双精度浮点型,输出使用%lf。e68a843231313335323631343130323136353331333365666166short int,短整型,输出对应%d。例如:#includevoid main(){double a;a=8.0/3.0;short int b;b=8;printf("a=%lf...
  • 看一小段C语言程序:int main(){float x = 1.3;x = x - (int)x;int i = (int)(x*);return ;}在你心目中, 变量 I 是怎样的结果?如果你理所当然地认为是3的话, 那么你就错了~~~实际结果应该是2. 为什么?简而言之, x在...
  • 文章目录一、概述二、转换示例三、基于转换误差的思考四、为什么float有些时候表达的int数据不准确一、概述C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,...
  • 今日在做ACM/ICPC的题目时,遇到了这样的情况:程序求得的结果是一个浮点数,但题目要求以整数形式输出(取不小于该结果的最小整数)。这是个很简单的问题。也许很多人会采用float强制转型为int再加1的办法解决。然而...
  • C语言printf输出浮点数精度问题

    千次阅读 2021-08-23 14:26:42
    相信学过C语言的人对printf这个函数再熟悉不过了,...这是C语言的默认输出6位,%f的输出让你觉得完全没问题,等等,似乎不太对,不是说计算机不能精确表示浮点数吗?这里怎么能精确表示呢? 稍等,请看下面的代码段。
  • 小白入门C语言浮点数详解

    千次阅读 多人点赞 2021-03-22 19:55:20
    C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。 在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间...
  • 浮点数详解
  • C语言浮点数存储方式

    2019-02-22 20:54:51
    C语言浮点数存储方式 对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用 32bit,double数据占用 64bit.其实不论是float类型还是double类型,在计算机内存中的存储方式都是遵从IEEE...
  • 精度浮点数与十六进制转换_C语言程序__单片机也可用
  • float,double分别遵循R32-24,R64-53的标准,​​他们的位数分别是23,52,即误差在2^-23,2^-52;所以float的精度误差在1e-6,double...要判断一个双精度浮点数:则是if( fabs(d_double) <= 1e-15 );判断两个浮点...
  • 浮点数与0比较 1.现象及原因 相信很多初学C语言的朋友一定犯过这样的错误: double x = 1.0; double y = 0.9; if (x - y == 0.1) { printf("You can see me!\n"); } else { printf("oops!\n"); } 理论上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,174
精华内容 6,469
关键字:

c语言浮点数与双精度

c语言 订阅
友情链接: extmrnalyexuecnal.zip