精华内容
下载资源
问答
  • 小白入门C语言浮点数详解
    千次阅读 多人点赞
    2021-03-22 19:55:20

    一、浮点数概念

    • 浮点数也称小数或实数。
    • C语言中采用floatdouble关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。
    • 在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内所有的值。
    • 占用内存的情况:
    #include <stdio.h>
     
    int main()
    {
      printf("sizeof float is %d\n",sizeof(float));//sizeof float is 4
      printf("sizeof double is %d\n",sizeof(double));//sizeof float is 8
      printf("sizeof long double is %d\n",sizeof(long double));//sizeof float is 16
    }
    
    • float只能表达6-7位的有效数字,不能用“==”判断两个数字是否相等。
    • double能表达15-16位有效的数字,可以用“==”判断两个数字是否相等。
    • long double占用的内存是double的两倍,但表达数据的精度和double相同。
    • 在实际开发中,建议弃用float,只采用double就可以,long double暂时没有必要,但不知道以后的操作系统和编译器对long double是否有改进。

    二、浮点数的输出

    • float采用%f占位符。
    • double采用%lf占位符。测试结果证明,double不可以用%f输入,但可以用%f输出,但是不建议采用%f,因为不同的编译器可能会有差别。
    • long double采用%Lf占位符,注意,L是大写。
    • 浮点数输出缺省显示小数点后六位。
    • 浮点数采用%lf输出,完整的输出格式是%m.nlf,指定输出数据整数部分和小数部分共占m位,其中有n位是小数。如果数值长度小于m,则左端补空格,若数值长度大于m,则按实际位数输出。
    double ff=70001.538;
    printf("ff=%lf=\n",ff);       // 输出结果是ff=70001.538000=
    printf("ff=%.4lf=\n",ff);     // 输出结果是ff=70001.5380=
    printf("ff=%11.4lf=\n",ff);   // 输出结果是ff= 70001.5380=
    printf("ff=%8.4lf=\n",ff);    // 输出结果是ff=70001.5380=
    

    三、常用的库函数

    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整除后的双精度余数
    // 把双精度val分解成整数部分和小数部分,整数部分存放在ip所指的变量中,返回小数部分。
    double modf(double val,double *ip);
    

    四、整数与浮点数的转换

    • 在浮点数的取值范围内,整数转换为浮点数不会有精度的损失,浮点数转换为整数后,会丢弃小数位。
    #include <stdio.h>
     
    int main()
    {
      int ii=3;
      int jj=4;
      double dd;
     
      dd=ii;        // 可以
      printf("dd is %.2lf\n",dd); //dd is 3.00
     
      dd=ii/jj;     // 不行
      printf("dd is %.2lf\n",dd); //dd is 0.00
     
      dd=(double)ii/jj;  // 可以
      printf("dd is %.2lf\n",dd); //dd is 0.75
    }
    

    五、科学计数法

    • 用科学记数法表示数时,不改变数的符号,只是改变数的书写形式而已,可以方便的表示日常生活中遇到的一些极大或极小的数 。如:光的速度大约是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,则按实际位数输出。
    #include <stdio.h>
     
    int main()
    {
      double dd;
     
      dd=123000000;
      printf("dd is  %.2e\n",dd);
     
      dd=-123000000;
      printf("dd is %.2e\n",dd);
     
      dd=0.0000000123;
      printf("dd is  %.2e\n",dd);
     
      dd=-0.0000000123;
      printf("dd is %.2e\n",dd);
    }
    
    • 运行结果:
      在这里插入图片描述
    更多相关内容
  • C语言浮点数转字符串
  • c语言浮点数

    2021-06-14 12:44:17
    c语言浮点数 内存中的浮点数 **浮点数在内存中的存储方式为:符号位,指数,尾数 类型:- 符号位:- 指数:- 尾数:- float 1位(第31位) 8位(第23~30位) 23位(第0~22位) double 1位(第63位) 11位...

    c语言之浮点数

    内存中的浮点数

    **浮点数在内存中的存储方式为:符号位,指数,尾数

    类型:-符号位:-指数:-尾数:-
    float1位(第31位)8位(第23~30位)23位(第0~22位)
    double1位(第63位)11位(第52~62位)52位(第0~51位)

    float和double类型的数据在计算机内部的表示法是相同的,但是由于所占存储空间的不同,其分割能够表示的数值范围和精度不同

    浮点数的存储示例

    浮点数的转换

    1.将浮点数转换成二进制

    2.用科学计数法表示二进制浮点数

    3.计算指数偏移后的值

    注意:计算指数时需要加上偏移量,而偏移量的值和类型有关。

    示例:对于指数6,偏移后的值如下:

    float:127+6->133
    double:1023+6->1029
    

    10进制浮点数的内存表示

    实数8.25的在内存中的float表示

    —8.25的二进制表示:1000.01->1.00001*(2^3)

    ​ 符号位:0

    ​ 指数:127+3->130->10000010

    ​ 小数:00001

    —内存中的8.25的float的表述:

    0100000100000100000000000000000000->0x41040000


    浮点类型的秘密

    1.float能表示的具体数字的个数和int相同

    2.float可表示的数字之间不是连续的,存在间隙。

    3.float只是一种近似的表示法,不能作为精确数使用。

    4.由于内存表示法相对复杂,float的运算速度比int要慢得多。

    注意:

    double与float具有相同的内存表示法,因此double也是不精确的。由于double占用的内存较多,所以表示的精度要比float高。

    总结

    1.浮点类型与整数类型的内存表示法不同

    2.浮点类型的内存表示更加的复杂

    3.浮点类型是一种不精确的类型

    4.浮点类型的运算速度较慢


    编程实验

    1.10进制浮点数的内存表示

    程序实验1

    2.float类型的不精确示例

    程序实验截图2

    RLqd-1623645832269)]

    2.float类型的不精确示例

    [外链图片转存中…(img-5xuho0nK-1623645832271)]

    展开全文
  • c语言浮点数高精度加法计算
  • C语言浮点数

    2021-05-23 04:37:30
    前几天,我在读一本C语言教材,有一道例题:#include void main(void){int num=9; /* num是整型变量,设为9 */float* pFloat=&num; /* pFloat表示num的内存地址,但是设为浮点数 */printf("num的值为:%d\n",num...

    前几天,我在读一本C语言教材,有一道例题:

    #include

    void main(void){

    int num=9; /* num是整型变量,设为9 */

    float* pFloat=&num; /* pFloat表示num的内存地址,但是设为浮点数 */

    printf("num的值为:%d\n",num); /* 显示num的整型值 */

    printf("*pFloat的值为:%f\n",*pFloat); /* 显示num的浮点值 */

    *pFloat=9.0; /* 将num的值改为浮点数 */

    printf("num的值为:%d\n",num); /* 显示num的整型值 */

    printf("*pFloat的值为:%f\n",*pFloat); /* 显示num的浮点值 */

    }

    运行结果如下:

    num的值为:9

    *pFloat的值为:0.000000

    num的值为:1091567616

    *pFloat的值为:9.000000

    我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

    要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记。

    2.

    在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

    int num=9;

    上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000 00000000 00000000 00001001,写成16进制就是0x00000009。

    那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?

    3.

    根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

    V = (-1)^s×M×2^E

    (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。

    (2)M表示有效数字,大于等于1,小于2。

    (3)2^E表示指数位。

    举例来说,十进制的5.0,写成二进制是101.0,相当于1.01×2^2。那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

    十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。

    IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

    0818b9ca8b590ca3270a3433284dd417.png 

    对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

    0818b9ca8b590ca3270a3433284dd417.png

    5.   IEEE 754对有效数字M和指数E,还有一些特别规定。   前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。   至于指数E,情况就比较复杂。   首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。   比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。   然后,指数E还可以再分成三种情况:   (1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。   (2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。   (3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。   6.   好了,关于浮点数的表示规则,就说到这里。   下面,让我们回到一开始的问题:为什么0x00000009还原成浮点数,就成了0.000000?   首先,将0x00000009拆分,得到第一位符号位s=0,后面8位的指数E=00000000,最后23位的有效数字M=000 0000 0000 0000 0000 1001。   由于指数E全为0,所以符合上一节的第二种情况。因此,浮点数V就写成:   V=(-1)^0×0.00000000000000000001001×2^(-126)=1.001×2^(-146)   显然,V是一个很小的接近于0的正数,所以用十进制小数表示就是0.000000。   7.   再看例题的第二部分。   请问浮点数9.0,如何用二进制表示?还原成十进制又是多少?   首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。   那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。   所以,写成二进制形式,应该是s+E+M,即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数,还原成十进制,正是1091567616。

    展开全文
  • C语言浮点数精度问题分析.pdf
  • 文章目录 (一)引入浮点数 (二)浮点数的详细解读 (1)一个公式表示浮点数 (2)内存中的浮点数 (一)引入浮点数 浮点数:就是计算机中的小数,按精度可分为单精度的float类型、双精度的double类型 我们通过一个...

    (一)引入浮点数

    浮点数:就是计算机中的小数,按精度可分为单精度的float类型、双精度的double类型

    我们通过一个简单的程序来重新认识下浮点数float类型(4字节)

    #include <stdio.h>
    int main()
    {
    	int a = 0x41440000;
    	int* p = &a;
    	float* fp = (float*)&a;
    	
    	printf("*p = %d\n", *p);
    	printf("*fp = %f\n", *fp);
    	return 0;
    }
    

    emmmm,这个程序的结果是什么呢??思考一会,我们来看看结果吧
    在这里插入图片描述
    可以看到*p就是0x41440000转成整型输出1094975488,这个没什么问题,关键问题在于同样的地址,使用float类型的指针来对该地址解析就成了12.250000

    可以这样说,浮点数的存储方式和整型数据存储形式完全不同呢!!

    (二)浮点数的详细解读

    (1)一个公式表示浮点数

    国际标准IEEE(电气工程师学会)表示:任意一个浮点数的二进制形式X都可以用下面这个公式来表示。
    X = (-1)^S * M * 2^E

    • X: 表示一个浮点数的二进制形式
    • (-1)^S: 确定符号位,当S == 0,表示该浮点数是正数;S == 1,表示该浮点数是负数
    • M: 表示有效数字(M范围[ 1, 2 ),需要通过左/右移动小数点来使整数部分处于该范围内 )
    • 2^E: 表示指数位

    由于有些浮点数比较复杂,所以暂时使用四字节的12.25来作为栗子

    在这里插入图片描述
    因为:12.25 > 0, 所以:(-1)^S 中的S== 0
    因为:1100.01 ,要想使M满足[1, 2),需要将小数点左移动3位M == 1.10001,所以E == 3
    此时的X == (-1)^0 * 1.10001 * 2^3 等价于1100.01

    那再试试-0.25这个呢
    S == 1
    二进制:-0. 01 可右移2位,使M == 1满足条件,E == -2
    X == (-1)^ 1 * 1 * 2^(-2);

    所以我们现在把12.25用这个公式表示出来了,但是但是,我们需要知道是如何存储在内存中的啊喂

    (2)内存中的浮点数

    在这里插入图片描述

    看到这里想必,你已经知道了(一)中的*fp的结果为什么是12.25了吧,并且通过内存中存储(小端)的值,也是和我们推出来是一致的。

    在这里插入图片描述

    展开全文
  • C语言浮点数的表示范围浅析浮点数C语言中的一种数据类型,但在标准C中并没有给出其具体的描述,即数的存储格式及表示范围。部分经(本文共3页)阅读全文>>现在这个时代,科学技术已经发展的很成熟了,家家户户各...
  • C语言减去浮点数

    2021-05-24 04:41:58
    #include #include float sum (float *A, int len) // sum of table of floats { float ss = 0.0; int i; for(i=0; i ; ++i) ss +=A[i];... C中的浮点数表示法还是2浮点数减法有问题吗?有人可以解释吗?
  • C语言浮点数(小数)

    2022-01-31 15:24:57
    是小数,那么,小数在c语言中怎么定义,输出和输入 浮点型的关键字有:double和float。 首先他是这样定义的:关键字 + 变量名 = 一个值.如下: float a = 12.12;//关键字为float double b = 18.18;//关键字为double...
  • 初学C语言中的浮点数

    2021-04-26 17:44:50
    浮点数也称小数或实数, C语言中采用float 和double关键字来定义小数, float 称为单精度浮点型, double称为双精度浮点型,long double更的双精度浮点型.浮点数通常只是实际值的近似值, 比如7.0可能被存储为6.999999 ...
  • 最近一段时间看到版上关于C++里浮点变量精度的讨论比较多,那么我就给对这个问题有疑惑的人详细的讲解一下intel的处理器上是如何处理浮点数的。为了能更方便的讲解,我在这里只以float型为例,从存储结构和算法上来...
  • C语言浮点数的输入与输出

    千次阅读 2021-05-23 03:07:02
    最近在做一些题目时,总是在lf与f的使用上出现问题。索性把它整理一下简单的说%f和%lf分别是float类型和double类型用于输入输出时对应的格式符号。其中:float,单精度浮点型,对应%f.double,双精度浮点型,对应%lf....
  • C语言浮点数的秘密

    千次阅读 多人点赞 2018-04-13 22:15:20
    那么浮点数在内存中又是以什么样的方式存储?有什么不为人知的特性?本章节,就来剖一剖浮点数这个家伙!  首先我们通过一张图来展示浮点数在内存中的存储方式   从图中可以看到,浮点数存储分为三段:符号位、...
  • 今日在做ACM/ICPC的题目时,遇到了这样的情况:程序求得的结果是一个浮点数,但题目要求以整数形式输出(取不小于该结果的最小整数)。这是个很简单的问题。也许很多人会采用float强制转型为int再加1的办法解决。然而...
  • C语言——浮点数加法

    千次阅读 2019-01-28 14:45:14
    求2个浮点数相加的和。  题目中输入输出中出现浮点数都有如下的形式:  P1P2...Pi.Q1Q2...Qj  对于整数部分,P1P2...Pi是一个非负整数。  对于小数部分,Qj不等于0。 Input 第1行是测试数据的组数n,每组测试...
  • 浮点数的表示与存储规则详解
  • 测试C语言浮点数转化为整数的方法 实验过程 方法1:强制转换,直接舍弃 #include <stdio.h> int test01(f){ int a; a = (int)f;//暴力转换,直接舍弃小数部分,只截取整数 return a; } int main(void
  • C语言实现浮点数与十六进制的转换

    千次阅读 2020-09-11 10:17:36
    我们可以借助memcpy函数!!! memcpy指的是C和C++使用的内存拷贝函数, 函数原型为**void *memcpy(void destin, void source, unsigned n); 函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址...
  • 虽然以前也学过浮点数的表示原理,大致的原理还是清楚的,但是使用 C 语言的来进性验证还没有尝试过,下面是验证的过程思路知道浮点数,是按照 32 位在内存中保存,其中第一位表示符号,后 8 位表示指数,最后 23 位...
  • C语言浮点数转换为字符串

    千次阅读 2021-05-19 08:35:42
    1、把float/double格式化输出到字符串标准的C语言提供了atof函数把字符串转double,但是没有提供把float/double转换为字符串的库函数,而是采用sprintf和snprintf函数格式化输出到字符串。函数声明:int sprintf...
  • C语言输出浮点数的符号、整数部分和小数部分 编写程序,从键盘输入一个不等于0的浮点数,然后分别输出这个浮点数的符号、整数部分和小数部分。例如输入-123.456,输出应该是(按下列格式输出): Sign:- Integral ...
  • C语言浮点数的发送和接收
  • 一、浮点数实现四舍五入 二、补充:ceil,floor,强制类型转换,round,四舍五入法对比及其应用场景 一、浮点数实现四舍五入 以保留3位数为例 1.直接实现【不利用库函数】 int (x*1000+0.5)/1000.0;【特别注意,...
  • C语言浮点数为0

    2020-05-09 23:53:52
    //请写一段小程序,比较浮点数和0的值的大小 int main() { #if 0 float data = 0.0; if(data==0.0) { printf("equal\n"); } else { printf("not equal\n"); } #endif // double tmp = 0.3;//0.3 0.299999 ...
  • C语言浮点数精度丢失

    千次阅读 2022-04-26 10:58:08
    浮点型变量分为单精度(float)型,双精度(double)型和双精度(long double)型,三类。 浮点数精度丢失 比如我们赋值给a=1.23456789e10,加10后,应该得到的值是1.234567891e10 #include<stdio.h> ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,641
精华内容 28,256
关键字:

c语言长浮点数