我用 C 编写了代码来计算三种不同情况的几何级数。三种情况的值如下。
案例一:
n=10000,a=2.0,r=0.01.
案例2:
n=500,a=0.01,r=1.1.
案例3:
n=100,a=0.0001,r=2.0。
几何级数有以下公式
Sn = a+ar^1 +ar^2 +ar^3 +···ar^n = a(1 - r^(n +1))/(1 - r)
在我的代码中,我计算了这两个公式。我的代码中左侧称为求和,右侧称为公式。
在第一种情况下,我的代码返回正确的值,但对于第二种和第三种情况,我返回巨大的数字。我不知道出了什么问题,因为第一个案例的代码与第二个和第三个案例相同。
有人可以告诉我为什么在第二种和第三种情况下我会得到大量数字以及如何解决这个问题?
我得到的案例输出如下:
======== Switch Case =========.
Case 1 summation = 2.020202
Case 1 formula = 2.020202
==============================.
Case 2 summation = 54668261640434936064.000000.
Case 2 formula = 54668261640434936060.000000
==============================.
Case 3 summation = 253530120045645892448944128.000000
Case 3 formula = 253530120045645892448944128.000000
==============================.
=======End of Switch Case=======.
我的代码如下
#include <stdio.h>
#include <math.h>
int main(){
// This script is for the geometric series
long double n = 0, a = 0, r = 0;
long double summation = 0, formula = 0;
printf("==============================\n");
printf("======== Switch Case =========\n");
for(int i = 1; i <= 3; i++ ){
// Switch case for three scenarios
switch (i){
case 1:
n = 10000, a = 2.0L, r = 0.01L;
summation = a;
printf("%.6Lf \n",summation);
for(int j = 1; j <= n; j++){
summation += a*powl(r,j);
}
formula = a*(1 - powl(r,n+1))/(1 - r);
printf("Case 1 summation = %.6Lf \n",summation);
printf("Case 1 formula = %.6Lf \n",formula);
printf("==============================\n");
break;
case 2:
n = 500, a = 0.01L, r = 1.1L;
summation = a;
printf("%.6Lf \n",summation);
printf("%.6Lf \n",formula);
for(int j = 1; j <= n; j++){
summation += a*powl(r,j);
}
formula = a*(1 - powl(r,n+1))/(1 - r);
printf("Case 2 summation = %.6Lf \n",summation);
printf("Case 2 formula = %.6Lf \n",formula);
printf("==============================\n");
break;
case 3:
n = 100, a = 0.0001, r = 2.0;
summation = a;
printf("%.6Lf \n",summation);
for(int j = 1; j <= n; j++){
summation += a*powl(r,j);
}
formula = a*(1 - powl(r,n+1))/(1 - r);
printf("Case 3 summation = %.6Lf \n",summation);
printf("Case 3 formula = %.6Lf \n",formula);
printf("==============================\n");
break;
}
}
printf("=======End of Switch Case=======\n");
return 0;
}
第二种情况,准确值为: 5.46682616404349358590563748207701185476524116704086448914383... × 10^19
您的代码返回 5.4668261640434936064 x 10^19,因此误差很小。
在第三种情况下,确切的值为:2.535301200456458802993406410751 × 10^26。您的代码返回 2.53530120045645892448944128 × 10^26,因此又出现了一个小错误。
所以你的代码返回大数字,因为结果应该是一个大数字。