计算麦克斯韦 - 玻尔兹曼分布

时间:2016-11-25 19:02:40

标签: c precision floating-accuracy scientific-computing

我正在尝试计算Maxwell-Boltzmann分布,但这段代码给出了0.00000,问题是什么?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{

    float e=2.718228183, pi=3.14159265, m=2.66*pow(10,-23), t, k=1.38*pow(10,-23), v, result;

    scanf("%f %f", &t, &v);

    result = sqrt(pow( m / (2*pi*k*t),   3))   * 4 * pi * pow(v,2) * pow(e, -(m * pow(v,2)) / (2*k*t)); 

    printf("%f", result);
}

2 个答案:

答案 0 :(得分:2)

如评论中所述,使用float以及常量的精度降低会产生一个不再可表示为float的结果。将数据类型更改为单独加倍会得到两位小数的精度。如果我们使用exp,pi的更多数字并对计算进行一些重组,我们得到12位精度。 E.g:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{

  double pi = 3.1415926535897932384626433832795028842, m = 2.66e-23, k =
      1.38e-23;
  double t, v, v2, dkt, result;
  // check omitted
  scanf("%lf %lf", &t, &v);

  v2 = v * v;
  dkt = 2 * k * t;

  result = pow(m / (pi * dkt), 3 / 2.0) * 4 * pi * v2 * exp(-(m * v2) / (dkt));
  printf("%.20g\n", result);
  return 0;
}

Pari / GP的结果为8.1246636077915008261803395870165527173e-9,上面代码的结果为8.1246636077914841125e-09。如果没有中间结果v2dkt以及sqrt的替代,我们得到8.1246636077914824582e-09,差别不大,特别是在准确无误的情况下。

如果你想要完整的16位十进制数字,你需要将整个事物分开并采取不同的方法。

答案 1 :(得分:-1)

替换

double pi=acos(-1.);

而不是

 double pi=3.1415926535897932384626433832795028842;