2017-11-27 3 views
2

これは私の問題です。私はTM4C123での私の待機のためにmsと私たちの間にいくつのクロックサイクルがあるかを計算する必要があります。しかし、私の倍率で値がゼロとして出てきて、他の値が間違っています。どんな助けでも大歓迎です。私が手二重の数字をCに格納していません(数字が小さすぎます)

#include <stdio.h> 

int main() 
{ 
    float ms_cycled; 
    float us_cycled; 
    int ms_cycle; 
    int us_cycle; 
    unsigned long MHz = 50; 
    double TPC = 1/(MHz*10000000); //calculate time per clock cycle 

    //calculate cycles for ms 
    ms_cycled = 0.001/TPC; 
    ms_cycle = ms_cycled; 
    //calculate cycles for us 
    us_cycled = 0.000001/TPC; 
    us_cycle = us_cycled; 
    printf("TPC = %.16f \n", TPC); 
    printf("ms_cycled = %f \n", ms_cycled); 
    printf("us_cycled = %f \n", us_cycled); 
    printf("ms_cycle = %i \n", ms_cycle); 
    printf("us_cycle = %i \n", us_cycle); 
    return 0; 
} 

出力は以下のとおりです。あなたが整数算術演算を使用している

TPC = 0.0000000000000000                                
ms_cycled = inf                                  
us_cycled = inf                                  
ms_cycle = -2147483648                                
us_cycle = -2147483648 
+0

これは私が今まで見たことのあるms当たりのクロックを計算するのに最も非効率的な方法です。もしあなたが 'MHz'を持っていれば、毎秒のクロックがあります。そして、1ミリ秒あたりのクロックは、その1/1000の単純な要因です。同様のことがμsあたりのクロックにも当てはまりますが、これもやはり1/1000の係数です。 'ms_cycle = MHZ * 1000; us_cycle = MHzである。 TPCの値は、10^6の代わりに10^7でMHzを掛け合わせることで、係数10でオフになります。 – Gerhardh

答えて

4
double TPC = 1/(MHz*10000000); 

注意。だから1/(50*10000000) = 1/500000000 = 0(タイプunsigned long)が得られます。 unsigned longからdoubleまでゼロをキャストすると、正しい結果ではなく、0.0になります。

浮動小数点演算にオペランドのいずれかを変更すると、問題を解決する必要があります。

double TPC = 1.0/(MHz*10000000.0) 
       ^^    ^^ 

あなたが代わりに同じ結果のためにこれを変更することができます。

double MHz = 50.0; 
       ^^ 
+1

'MHz'が' double'に変更された場合、 'MHz'が' double'であるという事実が浮動小数点に変換されることはもはや重要ではないことに注意してください。 –

+2

質問はあなたがそれを知っているかどうかではありません。それはOPがそれを知っているかどうかです。型の一貫性は悪くありませんが、必ずしも必要ではありません。 –

+0

@JonathanLeffler入手しました。私は今、私の答えを書き直しました。 – iBug

1

表現1/(MHz*10000000)unsigned longと値を入力しています結果をdoubleに格納しても、結果はゼロになりません。代わりに1.0/(MHz*10000000)を使用してください。

関連する問題