百科狗-知识改变命运!
--

C语言中printf函数中%f和%lf结果为什么一样

百变鹏仔1年前 (2023-12-16)阅读数 5#综合百科
文章标签类型精度

[转]

printf格式串中的%f到底是float还是double?实验来证明!

最近在CSDN上看到一个网友写下了类似如下代码,想以小数格式输出一个整数:

int a = 0, b = 0;

printf("%f, %d", a, b);

可是运行结果并不尽如人意,%f字段输出了0,%d字段输出一个较大的数据。

因为我最近刚阅读了浮点数的内存表示方法,所以对上述代码做出解释如下:

%f为double类型,需要两个字节表示,所以,printf在遇到%f时即将a,b的两个整型数据都读了去,而到了需要输出%d的时候,只能读取b的下一个单元,自然不是所期望的数据了。

但是有朋友说%f是float类型,%lf才是double类型,具此我特意查阅了MSDN和Linux man手册,均没有发现此类描述,在linux man手册中,说明%lf为long double类型。

为了说明问题,我又做了几个实验:

实验一,检查%f需要读取几个字节

int a=0, b=0, c=5;

printf("%f,%d\n", a, b, c);

输出结果:

0,5

结论:%f读取8个字节,即两个整型大小

实验二,检查%lf需要读取几个字节

int a=0, b=0, c=5;

printf("%lf,%d\n", a, b, c);

输出结果:

0,5

结论:%lf也读取8个字节(也许和机器位宽有关,我是32位的机器)

实验三,检查printf读取float类型数据

float a=0.0f;

int b=5;

printf("%f,%d\n", a, b);

输出结果:

0.0,5

结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节,即double类型的宽度,所以,编译器在将float类型参数入栈的时候,事先转换成了double类型。

实验四,再次证明实验三的结论

float a=0.0f;

int b=5;

printf("%d,%d,%d\n", a, b);

输出结果:

0,0,5

C语言中printf函数中%f和%lf结果为什么一样

结论:a在入栈的时候,占了8个字节。

以上4步,我觉得可以证明%f是按double类型输出的了,另外,我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型。

由于精度的原因,输出%lf和%f的数据不同,可能会造成错误。

主要有一下四点区别:

1、代表的数据类型不同

%f代表单精度浮点型数据(float),%lf代表双精度浮点型数据(double)。

2、有效数字位数不同

单精度浮点数有效数字保证6位,部分7位,双精度浮点数有效数字保证15位,部分16位。

3、所能表示数的范围不同

单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38,双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308

4、在程序中处理速度不同

一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)