C语言 单精度和双精度实数输出 | 您所在的位置:网站首页 › bmi编程c语言 › C语言 单精度和双精度实数输出 |
类型转换字符%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。 图片: 解读: 因为%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确定精度。 结果: 输出结果: 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 其实,这就是一个%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 实验室设备网 版权所有 |