用c语言实现pow函数,功率为-3/2或-5/2

时间:2018-03-15 22:06:43

标签: c infinite-loop pow divide-by-zero

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

2 个答案:

答案 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.2r += 0.2

完成

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

5)为了不松散double精度,变量f也应该被声明为double

6)f的{​​{1}}值非常难以计算。对于r=0,该算法在数值上不稳定。我们有两个无限的分裂。解决问题的正确方法是在r = 0点找到函数限制。在数字上,它足以将0+设置为接近r

enter image description here

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

enter image description here

如果您有更多问题,请与我们联系。

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