作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试计算麦克斯韦-玻尔兹曼分布,但此代码给出 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);
}
最佳答案
如评论中所述,使用 float
以及降低的常量精度会导致无法再用 float
表示结果。单独将数据类型更改为 double 可提供两位小数的精度。如果我们使用 exp
,更多的 pi 位数并对计算进行一些重新组合,我们会得到 12 位的精度。例如:
#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
。如果没有中间结果 v2
、dkt
和 sqrt
的替换,我们得到 8.1246636077914824582e-09
,没有太多差异,尤其是在没有任何收获的准确性方面。
如果您想要完整的 16 位十进制数字的准确性,您需要将整个事情拆开并采取不同的方法。
关于计算麦克斯韦-玻尔兹曼分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811034/
我是一名优秀的程序员,十分优秀!