幂为-3/2或-5/2的c语言pow函数的实现

Implementation of pow function in c language with power of -3/2 or -5/2

我是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();
}

来自http://en.cppreference.com/w/c/numeric/math/pow

If base is zero and exp is negative, a domain error or a pole error may occur.

当您将 r 的值设置为零时 pow(r, -1.5) 求值时,您 运行 会遇到这种情况。

更改循环,使 r 以 0.2 而不是零开始。

此外,您需要在 for 语句中使用 r += 0.2 而不是 r+0.2

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);
}

您可能想知道:

C 标准 7.12.1 [ISO/IEC 9899:2011] 定义了三种与 .第 2 段指出

A domain error occurs if an input argument is outside the domain over which the mathematical function is defined.

第 3 段规定

A pole error (also known as a singularity or infinitary) occurs if the mathematical function has an exact infinite result as the finite input argument(s) are approached in the limit.

第 4 段规定

A range error occurs if the mathematical result of the function cannot be represented in an object of the specified type, due to extreme magnitude.

函数 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 函数应 return int 值并采用 void 而不是空括号 ()

3) 可以通过r = r + 0.2r += 0.2

进行自增操作

4) 为了避免在接近 0(r-1)/r 中被零除,必须使用值代替。

5) 为了不松动 double 精度,还应声明变量 f double

6) f对于r=0的值极难计算。对于 r = 0,该算法在数值上不稳定。我们有两个无穷大的除法。正确的解决方法是在0+点找到函数极限。在数值上,它足以将 r 设置为接近 0

7) 由于 f 函数的性质,您可能会考虑 r 更小的步骤,以便捕捉更好的情节。

#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;
}

测试:

Value of f for r= 0.000000  is  f= 0.000000  f1= 0.000000                                                                                     
Value of f for r= 0.200000  is  f= 0.199492  f1= 0.199492                                                                                     
Value of f for r= 0.400000  is  f= 0.307038  f1= 0.307038                                                                                     
Value of f for r= 0.600000  is  f= 0.193604  f1= 0.193604                                                                                     
Value of f for r= 0.800000  is  f= 0.051949  f1= 0.051949                                                                                     
Value of f for r= 1.000000  is  f= 0.000000  f1= 0.000000                                                                                     
Value of f for r= 1.200000  is  f= 0.046058  f1= 0.046058                                                                                     
Value of f for r= 1.400000  is  f= 0.166843  f1= 0.166843                                                                                     
Value of f for r= 1.600000  is  f= 0.338256  f1= 0.338256                                                                                     
Value of f for r= 1.800000  is  f= 0.542116  f1= 0.542116                                                                                     
Value of f for r= 2.000000  is  f= 0.765977  f1= 0.765977                                                                                     
Value of f for r= 2.200000  is  f= 1.001644  f1= 1.001644                                                                                     
Value of f for r= 2.400000  is  f= 1.243810  f1= 1.243810                                                                                     
Value of f for r= 2.600000  is  f= 1.489073  f1= 1.489073                                                                                     
Value of f for r= 2.800000  is  f= 1.735278  f1= 1.735278                                                                                     
Value of f for r= 3.000000  is  f= 1.981075  f1= 1.981075                                                                                     
Value of f for r= 3.200000  is  f= 2.225642  f1= 2.225642                                                                                     
Value of f for r= 3.400000  is  f= 2.468498  f1= 2.468498                                                                                     
Value of f for r= 3.600000  is  f= 2.709387  f1= 2.709387                                                                                     
Value of f for r= 3.800000  is  f= 2.948194  f1= 2.948194                                                                                     
Value of f for r= 4.000000  is  f= 3.184898  f1= 3.184898                                                                                     
Value of f for r= 4.200000  is  f= 3.419535  f1= 3.419535                                                                                     
Value of f for r= 4.400000  is  f= 3.652177  f1= 3.652177                                                                                     
Value of f for r= 4.600000  is  f= 3.882916  f1= 3.882916                                                                                     
Value of f for r= 4.800000  is  f= 4.111856  f1= 4.111856                                                                                     
Value of f for r= 5.000000  is  f= 4.339103  f1= 4.339103

如果您有更多问题,请告诉我。