C语言 单精度和双精度实数输出 您所在的位置:网站首页 bmi编程c语言 C语言 单精度和双精度实数输出

C语言 单精度和双精度实数输出

2023-12-14 14:37| 来源: 网络整理| 查看: 265

类型转换字符%f的使用。

#include int main() { float f=123.456; double d1,d2; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("%f\n%12f\n%12.2f\n%-12.2f\n%.2f\n",f,f,f,f,f); printf("d1+d2=%f\n",d1+d2); return 0; }

运行结果: C语言在线编辑+运行 在这里插入图片描述

本案例程序的输出结果中: 数据123.456001和3333333333333.333010中的001和010都是无意义的,因为它们超出了有效数字的范围。

为什么这么说?

1.什么是有效数字? 从一个数的左边第一个非0数字起,到末位数字止,所有的数字都是这个数的有效数字。 如:0.0109,前面两个0不是有效数字,后面的109均为有效数字(注意,中间的0也算)。 再如:3.109,3 1 0 9为有效数字。 —————————————————————————————————————————————————————————— 2.在C语言中如何使用有效数字的? %f 输出7位有效数字,%.Nf 最多也就16位有效数字。 也就是说一个浮点型【float】变量只能保证有效数字是7位,整体只有前7位是准确数字【或者说有效数字,有意义的数字】,超出的数是没有意义的。不同的编程工具显示的结果(指的是无意义的数字)也是有可能不相同的。 %f 默认保存6位小数,不够用0来补。

3.什么是有意义的数字? 你想啊,你定义的数字比如 f1=123.456,那么有意义的参与运算的数字就是123.456。只不过叫它为6位有效数字而已。 其他的输出除去123.456的部分都是无意义的。因为123.456是有效数字,所以它是有意义的。

案例演示:目的是为了f1=123.456打印为什么是123.456001而不是123.456000。 图片: 在这里插入图片描述

#include int main() { float f1 = 123.456,f2 = 123.4567,f3 = 123.45678; printf("f1=%f\nf2=%f\nf3=%f\n",f1,f2,f3); return 0; }

解读: 因为%f 输出7位有效数字,所以f1和f2都在有效范围之内,f3故意超出一位。 输出结果: f1=123.456001 其中001这个随机数字是编程工具加上去的,它不是我们定义的格式控制符认为合法的有效数字,故无意义。 输出结果: f2=123.456703 其中03这个随机数字也是编程工具加上去的,它也不是我们定义的格式控制符认为合法的有效数字,故无意义。 输出结果: f3=123.456779 而我们定义的是123.45678, 因为%f 输出7位有效数字,f3故意超出一位,所有后面的79这个随机数字也是编程工具加上去的,它也不是我们定义的格式控制符认为合法的有效数字,故无意义。

到这里,你应该懂了: 拿%f格式控制符的有效数字来说,只要你定义的有效数字在7位之内,可以打印出来,但6位小数位缺少的会是编程工具产生的无意义的随机数。即使你的有效数字是8位,也只展示正确的前7位,余下的也是编程工具产生的随机数。

案例演示:什么时候补0 首先要搞清楚为什么会有补0这个说法? 为了使输出的数字有意义,如果都是0。那就变成整型了。所以为了控制这种误差,会补0确定精度。 结果: 在这里插入图片描述 一步一步加点东西,变得复杂一点的: 在这里插入图片描述 关键词: %f 有效数字 默认补0 【关键词的作用就是减少说话篇幅,压缩信息,你自己能脑补信息解压信息】 输出结果: f0=987.000000 为了标识它是浮点类型,补了6个0;

输出结果: f1=1.123000 f2=2.123400 f3=3.123450 f4=4.123456 f1,f2,f3都在有效数字范围之内,小数位数补了0是编辑器加上的,不同的数补的不一样比如 123.456 补的是 123.456001。 f4满打满算,7个有效数字正好,什么都不用加。

输出结果f5: f5=5.234568 f5超出了有效数字,也超出了默认支持6位小数,触发了四舍五入的机制,所以: 最终 有效数字 + 四舍五入 双剑合一,得出最终结果: f5=5.234568

输出结果: f6=56.123322 实际定义的: f6=56.123321 你应该懂了,【学习能力】, 结合 有效数字就可以明白,编程工具只展示 56.12332 这7个有效数字,后面那个2是无意义的,所以展示的是一个随机值。 假设把f6=56.123321 最后的1删了会怎么样? 定义成 f6=56.12332, 输出成 f6=56.123322 在这里插入图片描述 定义成 f6=56.12332, 输出成 f6=56.123322 结果又是多了随机值2,这是编辑器帮我们干的事情。不同的编辑器随机值可能相同,也可能不同。

其实,这就是一个%f格式控制符,在7位有效数字合法范围之内的编辑器展示结果的分析,有的时候还会触发四舍五入的机制,有的时候是整数会默认补0。 这个不是单一的情况你搜一下就能明白,你得自己列举多个情况并自己调试,让结果说话,别人说的可能是错的。

代码如下:

#include int main() { float f0 = 987,f1 = 1.123,f2 = 2.1234,f3 = 3.12345, f4=4.123456,f5=5.2345678,f6=56.123321; printf("f0=%f\nf1=%f\nf2=%f\nf3=%f\nf4=%f\nf5=%f\nf6=%f",f0,f1,f2,f3,f4,f5,f6); return 0; }

—————————————————————————————————————————————————————————— 现在再说为什么 数据123.456001和3333333333333.333010中的001和010都是无意义的,因为它们超出了有效数字的范围。【分别是7和16】

总结成一句话: 浮点型变量直接送7位有效数字,具体的有效数字就是你定义了多少就是多少,如果编译器展示的值的位数有偏差,那有偏差的尾巴是无意义的。记住这句话就行。

有效数字就是你定义的数字,【想想数学要你保留3位有效数字,这3位有效数字当然是你自己写的定义】, 后面的尾巴001是编辑器随机加上的。

联系生活,那些做实验,经常会说在误差运行范围之内,因为计算机算的时候就存在误差,没有绝对的精确。

—————————————————————————————————————————————————————————— 可以忽略的相关信息:【没有代码演示实操,建议忽略不看,只做了解内容】 对于实数,也可使用格式符%e,以标准指数形式输出:尾数中的整数部分大于等于1、小于10,小数点占一位,尾数中的小数部分占5位;指数部分占4位(如e-03),其中e占一位,指数符号占一位,指数占2位,共计11位。 也可使用格式符%g,让系统根据数值的大小,自动选择%f或%e格式、且不输出无意义的零。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有