2016-11-25 7 views
0

私はMaxwell-Boltmann分布を計算しようとしていますが、このコードは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); 
} 
+4

コードを置き換えるには、 '*何*入力値のための0.000000'を与えますか? –

+0

は今やちょうど0になります@SvenMarnach – user6200763

+0

例えば500 100 @WeatherVane – user6200763

答えて

2

コメントで説明したように、一緒に定数の低減精度floatの使用はfloatとしてもはや表現できない結果を与えます。データ型をdouble型に変更すると、2桁の精度が得られます。 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; 
} 

巴里/ GPからの結果は8.1246636077915008261803395870165527173e-9であり、我々は上記のコードで取得する結果が8.1246636077914841125e-09です。中間結果なしで、dktと交換sqrt私たちは8.1246636077914824582e-09を得た、特にそれが何も得られなかった精度との違いはあまりありません。

正確な16進数の16桁をすべて表示するには、全体を別にして別の方法をとる必要があります。

+0

あなたのコードの本当の修正は偶然です。 'printf("%e "、result);'でOPのコードは '8.127763e-09'を計算します。他の変更はほとんどfluffです。 – EOF

+0

@EOF上記のコードは、最後の文で明らかにされているように、修正を意味しません。少なくとも私はそれが最後の文であると思っていたのですが、ただちに修正がなく、完全に異なったアプローチをとっているだけです。ダブルダブル(112ビットのダブルダブル)は限られているが多分十分に広い範囲でそれを行うかもしれないが、私は計算の完全な分析をしなかった。 'exp'と 'pow(x、y)'(= 'exp(y log x)')は、Remezなどで見つかったシリーズとミニマムポリを示唆します(http:// lolengineの助けを借りて.net/wiki/oss/lolremez)。 – deamentiaemundi

+0

OPの間違いは、おそらく* n番目の10進数が間違っているとは限りません。 OPの問題は、 'printf()'変換指定子としての '%f 'のイディオシにより、結果が完全に役に立たない*ということでした。 – EOF

0

double pi=acos(-1.); 

代わりの

double pi=3.1415926535897932384626433832795028842; 
関連する問題