c语言计算为啥结果不对

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言计算为啥结果不对相关的知识,希望对你有一定的参考价值。

为什么不同程序结果不一样。

在double转换成int时,应当考虑到数值并不准确的问题,可以考虑自己要求的精度极限,比如是0.00000001,可以写成:printf("%d\\n",(int)(a/pow(10,b-1)+0.000000005); 这样可以配合取整实现在那位上的四舍五入。

参考技术A 这是算法设计上的问题。
一般而言,浮点运算会带来误差,不同的编译器会有不同。
如果浮点运算的结果是5.00000000……就发现不了误差;而算成了4.9999999999.……后,经(int)就变成了4。
如果写成a/1000就不会有误差存在。
也可以自己写一个intpow()函数。
int intpow(int x,int n)追问

我刚才试了一下,我如果不把数据强制转换为int型算出的结果就是正确的5.000000,这是为什么呢

追答

这是因为double能保证15位有效数字。在此范围内的数字是正确的,而它默认的输出是6位小数,后面的部分四舍五入,所以你看到的答案是正确的。
如果用printf("%.20lf",.....);就能看到误差了。

追问

我显示50位小数还是5.00000000000000000000000000000000000000000000000000

追答

编译系统比较智能。
这样更直接:
printf("%.20lf",x-5.0);

就能直接看到偏大(为正)还是偏小(为负),偏差了多少。

追问

我觉得重点不在这里,你看我的上一行代码,pow(10,3)输出就是5,而b=3,pow(10,b)输出的就不对

追答

这只能说是这个编译器比较“高大上”了(因为int b=4, b-1=3应该是没有误差的)。

参考技术B 函数pow(x, y)的功能是计算x的y次幂,其返回值是一个双精度浮点型数据。当在C语言的编洋程序处理数值运算时,如果算式中出现浮点型数据,为了保证运算的精度,则与该浮点数相运算的其它类型操作数也要先转为浮点型数据,然后再参与运算。不同版本的编译软件生成的操作在进行浮点型数据转换和运算处理时,算法不完全一样,有可能会产生误差。
在此题目中在,算式a/pow(10,b-1)的操作数a,b虽都是整型数,但运算时要先转换成浮点型,且产生浮点型运算结果。由于浮点数表示时可能产生误差,5可能会表示为4.9999999…(对于双精度浮点数,小数点后面的有效位数可达到15一16位)。然而,在将其转换为int型时,只截取了整数部分,导至出现了4这个结果。
参考技术C 这个是因为pow计算的时候精度引起的。比如2.0/2.0,他的结果理论是1.0,但有些编译器结果会是0.999999999999999999,这个很接近1了,但是你将这个数取整,结果会是0.
你上面用%lf来打印,会发现一个是5.0000xxx,一个会是4.999999xxxx。追问

但是你看我的上一行代码,我的上一行代码是pow(10,3)和pow(10,b)是一样的,为什么上面的就没有显示4

追答

你的3是由b-1得到的,b=4,即4-1,按你的思维4-1要等于3,这没错。但是这个时候整数运算会升级为浮点运算,因为是在pow函数里的计算,所以4-1的结果不等于3,而是等于2.9999xxxxx.

参考技术D 第二张图是正确的,结果都是5,可能是第一个编译器有点问题

r语言关联规则为啥只产生了1条规则

参考技术A 写的很清楚啊,列的类型不对,不是逻辑值或是factor(因子、因素)。 你的那些列不会是数值型的吧,不适用apriori的。

以上是关于c语言计算为啥结果不对的主要内容,如果未能解决你的问题,请参考以下文章

急~~~~~~为啥我用C语言和蔡勒公式写的算某一天是星期几的程序总是不对?

dev c语言 输入两数,输入符号进行加减乘除运算,结果不对,求大神改错

C语言问题:为啥函数调用的这句delnum(item);改成void delnum(char *item)就不对呢

C语言;计算表达式

c语言这个逗号表达式的结果是啥,为啥?

c语言 后缀表达式计算