C语言浮点数误差的解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言浮点数误差的解决相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
main()

int k;
float a=2.6;
while(a>=1)

sx=sx-1;
k++;
if(sx<1)

printf("1=%d\n",k);
k=0;


while(sx>=0.5)

printf("0.5=1\n");
sx=sx-0.5;

while(sx>=0.2)

sx=sx-0.2;
k++;
if(sx<0.2)
printf("0.2=%d\n",k);

while(sx>=0.1)

sx=0;
printf("0.1=1\n");

getch();


换成 sx=2.1也是一样, 这个0.1的误差应如何解决呢?
额,写错了点。

#include<stdio.h>
main()

int k;
float sx=2.6;
while(sx>=1)

sx=sx-1;
k++;
if(sx<1)

printf("1=%d\n",k);
k=0;


while(sx>=0.5)

printf("0.5=1\n");
sx=sx-0.5;

while(sx>=0.2)

sx=sx-0.2;
k++;
if(sx<0.2)
printf("0.2=%d\n",k);

while(sx>=0.1)

sx=0;
printf("0.1=1\n");

getch();

浮点数表示法的确存在精度丢失的问题,是由于最低有效位的限制造成的。而且一般其实际表示的数值会比规定的要小。比如2.6的浮点数表示为40266666H,而该数实际的值是2.5999999,这样计算的结果是0.0999999比0.1小,不能输出0.1,产生精度丢失,而如果将其表示更改为40266667H,其表示的实际值是2.6000001,而这个数可以输出0.1的结果的。所以如果要使计算能够得出正确结果,可以尝试在输入的时候将有效位数扩展,以确保得出正确结果。
比如要输出2.6的结果,可以设sx=2.6000001,这样可以使浮点数表示结果为大于2.6的尽可能小的值。如果要输出2.1的结果,可以设sx=2.1000001。
int k=0;
float sx=2.6000001;
参考技术A 浮点数表示法的确存在精度丢失的问题,是由于最低有效位的限制造成的。而且一般其实际表示的数值会比规定的要小。比如2.6的浮点数表示为40266666H,而该数实际的值是2.5999999,这样计算的结果是0.0999999比0.1小,不能输出0.1,产生精度丢失,而如果将其表示更改为40266667H,其表示的实际值是2.6000001,而这个数可以输出0.1的结果的。所以如果要使计算能够得出正确结果,可以尝试在输入的时候将有效位数扩展,以确保得出正确结果。
比如要输出2.6的结果,可以设sx=2.6000001,这样可以使浮点数表示结果为大于2.6的尽可能小的值。如果要输出2.1的结果,可以设sx=2.1000001。
int k=0;
float sx=2.6000001
参考技术B 浮点数的比较很麻烦,像while(sx>=0.1)这个等号很不保险
要判断一个浮点数是否等于另外一个浮点数,一般是求二者的差,差的绝对值小于某给定值就算相等 像这样:
while((sx-0.1)<0.00001&&(0.1-sx)<0.00001)

sx=0;
printf("0.1=1\n");


总之,在程序中应该尽量避免浮点数的比较本回答被提问者和网友采纳
参考技术C 需要做浮点数运算的时候,先把数值乘以1000,或者10000,算好了,可以在除下来 参考技术D fabs(evaluate(eval)-res) < 0.001
用这个函数追问

什么意思? 能用C语言说下吗?

追答

2个数相减的绝对值< 0.001
就是误差不超过0.001

js浮点数精度误差问题,解决方法

参考技术A JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。下面就分析下为什么会有这个精度误差,以及怎样修复这个误差。
首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
原来如此,那怎么解决这个问题呢?我想要的结果就是 0.1 + 0.2 === 0.3 啊!!!
有种最简单的解决方案,就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入,比如:
var numA = 0.1;
var numB = 0.2;
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );

乘法运算中有这种,比如0.58*100,结果是57.99999999999999。可以用Math.round()进行处理,

------||-------
尽量避免对小数进行操作,先处理成整数后在进行操作,其结果会比较精确。

以上是关于C语言浮点数误差的解决的主要内容,如果未能解决你的问题,请参考以下文章

js浮点数精度误差问题,解决方法

C++浮点数误差是啥

浮点数float累加误差解决方式总结

关于浮点型误差的解决方法

Python浮点数误差与解决方法

Python浮点数误差与解决方法