首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >麦克斯韦-玻尔兹曼分布的计算

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

Stack Overflow用户
提问于 2016-11-26 03:02:40
回答 2查看 570关注 0票数 0

我正在尝试计算麦克斯韦-玻尔兹曼分布,但是这个代码给出了0.00000,有什么问题吗?

代码语言:javascript
复制
#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);
}
EN

回答 2

Stack Overflow用户

发布于 2016-11-26 03:53:29

正如注释中所描述的,使用float和降低常量的精度可以得到一个不能再表示为float的结果。仅将数据类型更改为double就可以获得两位小数精度。如果我们使用exp,pi的位数更多,并对计算进行一些重组,我们得到12位的精度。例如:

代码语言:javascript
复制
#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。没有中间结果v2dktsqrt的替换,我们得到了8.1246636077914824582e-09,没有太大的区别,特别是在准确性方面,它什么也得不到。

如果你想要完整的16位小数精度,你需要把整个东西拆开,采取一种不同的方法。

票数 2
EN

Stack Overflow用户

发布于 2017-11-12 00:39:57

替换

代码语言:javascript
复制
double pi=acos(-1.);

而不是

代码语言:javascript
复制
 double pi=3.1415926535897932384626433832795028842;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40811034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档