2017-11-27 4 views
2

Das ist mein Problem, ich muss berechnen, wie viele Taktzyklen in einer ms sind und uns für meine PLL wartet auf ein TM4C123. Die Werte erscheinen jedoch als Null auf meinem Doppel, was meine anderen Werte falsch macht. Jede Hilfe würde sehr geschätzt werden.Double speichert Nummer nicht in C (ist die Nummer zu klein)

#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; 
} 

Die Ausgänge I erhalten sind:

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

Das ist der ineffizienteste Weg, um Uhren pro ms zu berechnen, die ich je gesehen habe. Wenn Sie "MHz" haben, haben Sie Uhren pro Sekunde. Und Uhren pro ms ist einfach ein Faktor 1/1000 davon. Gleiches gilt für die Uhren pro μs, was wiederum ein Faktor von 1/1000 ist. 'ms_cycle = MHZ * 1000; us_cycle = MHz'. Ihr Wert für "TPC" ist um den Faktor 10 verringert, wenn Sie MHz mit 10^7 anstelle von 10^6 multiplizieren. – Gerhardh

Antwort

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

Beachten Sie, dass Integer-Arithmetik verwenden. So erhalten Sie 1/(50*10000000) = 1/500000000 = 0 (vom Typ unsigned long). Casting Null von unsigned long bis double gibt Ihnen nur 0.0, nicht das richtige Ergebnis.

Ändern einer der Operanden zu Punkt arithmetics floating das Problem lösen sollte:

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

Alternativ können Sie dies für das gleiche Ergebnis ändern:

double MHz = 50.0; 
       ^^ 
+1

Beachten Sie, dass, wenn "MHz" in "double" geändert wird, es nicht mehr entscheidend ist, dass die anderen Zahlen in Gleitkommawerte umgewandelt werden, da die Tatsache, dass "MHz" "double" ist, die Berechnung in "doppelter" Arithmetik durchführt . –

+2

Die Frage ist nicht, ob Sie es wissen; es ist, ob das OP es weiß. Typkonsistenz ist nicht schlecht, aber nicht immer notwendig. –

+0

@ JonathanLeffler Verstanden. Ich habe meine Antwort jetzt neu formuliert. – iBug

1

Der Ausdruck 1/(MHz*10000000) hat Typ unsigned long und Wert 0. Speichern des Ergebnisses in einem double macht das Ergebnis nicht weniger Null. Verwenden Sie stattdessen 1.0/(MHz*10000000).