由于两个正数的差u=x-y的相对误差是:d(lnu)=(dx-dy)/(x-y),如果x和y很相近,它们的差就会很小,因而u的相对误差很大,这是由于x*和y*的前几位有效数字必然相同,相减以后有效数字位会大大减少的缘故,这时应该多保留几位有效数字,或变换计算公式以防止这种情形的出现。
程序如下:
#include <stdio.h>
#include <math.h>
void main()
{
double x,y1,y2;
printf("输入x的值(接近于0):");
scanf("%lf",&x);
y1=(1-cos(x))/sin(x);
y2=sin(x)/(1+cos(x));
printf("原公式计算后的值为:%1.30f\n",y1);
printf("变换公式计算后的值为:%1.30f\n",y2);
}
运行结果如下所示:
可以通过多保留几位有效数字或者变换计算公式避免像个相近的数相减得到的误差,在实验中,采用变换公式的方式来避免两个相近的数相减而引起的误差。把公式(1-cos(x))/sin(x)中有相减的项转换为相加的项,即为:sin(x)/(1+cos(x));再进行计算,就会避免引起误差,在试验中,还保留了比较多的有效数字位,也可以观察的到有避免误差的产生。