我是C语言的新手。我正在尝试实施公式(r to power of (-3/2)) * exp(t*(r-1/r)
。我正在使用pow
函数,但是当我将这个等式保持在for循环中时,它会不断地实现循环,说明"pow domain error"
。我希望for循环的增量为0.2
。请帮我实现这个公式。代码是:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
double R,r;
float f;
clrscr();
for(r=0;r<=5;r+0.2)
{
R=pow(r,-1.5)*exp(2.5*(r-1)/r);
f=r-R;
printf("value of f is:%f",f);
}
getch();
}
答案 0 :(得分:2)
您可能想知道:
C标准7.12.1 [ISO/IEC 9899:2011]
定义了三种与数学函数有关的错误。第2段陈述
如果输入参数在域外 ,则会出现域错误 其中定义了数学函数。
第3段陈述
如果出现极点错误(也称为奇点或无穷大) 数学函数作为有限输入具有精确的无限结果 参数在极限内接近。
第4段陈述
如果函数的数学结果不能,则会发生范围错误 由于极端,在特定类型的对象中表示 大小
功能 pow(x,y)
的可用域是:
(x > 0) || (x == 0 && y > 0) || (x < 0 && y is an integer)
这意味着您无法使用r = 0
作为pow
的参数。
1)
pow(r, -1.5) = r^(-3/2) = 1.0/ r^3/2 = 1.0/sqrt(r*r*r);
2)用C语言编写
main
函数应返回int
值,void
不是空括号()
3)增量操作可以通过r = r + 0.2
或r += 0.2
4)为了避免在(r-1)/r
中接近零,必须使用接近0
值。
5)为了不松散double
精度,变量f
也应该被声明为double
。
6)f
的{{1}}值非常难以计算。对于r=0
,该算法在数值上不稳定。我们有两个无限的分裂。解决问题的正确方法是在r = 0
点找到函数限制。在数字上,它足以将0+
设置为接近r
。
7)由于0
函数的性质,您可以考虑为r
设置更小的步长,以捕获更好的情节。
f
测试:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#define ZERO_PLUS 1e-14
void calculate_and_print(double r)
{
double f, f1;
f = r - pow(r, -1.5) * exp(2.5*(r-1)/r);
f1 = r - (1.0 /sqrt(r*r*r)) * exp(2.5*(r-1)/r);
printf("Value of f for r= %f is f= %f f1= %f \n", r, f, f1);
}
int main(void)
{
clrscr();
calculate_and_print(ZERO_PLUS);
for (double r = 0.2; r < 5.0; r += 0.2 )
calculate_and_print(r);
calculate_and_print(5.0);
return 0;
}
如果您有更多问题,请与我们联系。
答案 1 :(得分:1)
来自http://en.cppreference.com/w/c/numeric/math/pow:
如果base为零且exp为负,则可能发生域错误或极点错误。
当您将pow(r, -1.5)
的值r
设置为零时,您会遇到这种情况。
更改循环,使r
以0.2而不是零开始。
此外,您需要在r += 0.2
声明中使用r+0.2
代替for
。
for ( r = 0.2; r <= 5; r += 0.2)
{
R = pow(r, -1.5)*exp(2.5*(r-1)/r);
f = r-R;
printf("value of f is:%f", f);
}