幂为-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.2
或r += 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
如果您有更多问题,请告诉我。
我是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.2
或r += 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
如果您有更多问题,请告诉我。