关于C语言编程科学计算(高手进)

来源:百度知道 编辑:UC知道 时间:2024/06/20 20:48:28
我想用斯蒂芬森(Steffensen)加速法做方程,编的程序如下:
#include <stdio.h>
#include <math.h>
void main()
{
int N,n=0,k;
float Tol,p[3],p1,f0;
printf("Please enter the number of p[0],N,Tol:");
scanf("%f%d%f",&p[0],&N,&Tol);
while(n<=N)
{
n=n+1;
for(k=0;k<=1;k++)
p[k]=p[k-1]-(p[k-1]*cos(p[k-1])-p[k-1])/(cos(p[k-1])-p[k-1]*sin(p[k-1])-1);
p1=p[0]-(p[1]-p[0])*(p[1]-p[0])/(p[2]-2*p[1]+p[0]);
printf("n=%d,p1=%f\n",n,p1);
f0=p1*cos(p1)-p1;
if (fabs(f0)<Tol) break;
else p[0]=p1;
}
printf("The last result is p1=%e,n=%d\n",p1,n);
getch();
}
但每次运行时都是:
Please enter the number of p[0],N,Tol:1.5 3000 0.00001
Floating point error: Domain.

我用的是TC2.0,哪位高手帮我看看,谢谢
改过双精度的了,不行啊!!
楼下说:k=0 时 p[k-1] = p[-1] ,可是上边已经k++了,应该没问题吧,不懂,请赐教。

for(k=0;k<=1;k++)
p[k]=p[k-1]-(p[k-1]*cos(p[k-1])-p[k-1])/(cos(p[k-1])-p[k-1]*sin(p[k-1])-1);

k=0的时候p[k-1]溢出。。。。。
btw 没必要用break,你把两个退出循环的条件and一下就是了

三角函数好像是双精度的,把float改成double试试。

for(k=0;k<=1;k++)
p[k]=p[k-1]-(p[k-1]*cos(p[k-1])-p[k-1])/(cos(p[k-1])-p[k-1]*sin(p[k-1])-1);

k=0 时 p[k-1] = p[-1]

我用TC2.01试了没错,,我截了图: