Division by Zero

#576062
Lesenswert?

Sorry, ei wenig durcheinander. Hier natürlich noch der Quelltext:
1
if(CONFIG.FREQ <= 100 && CONFIG.FREQ != 0)
2
        OCR1A = ((1/CONFIG.FREQ) / (1/(4000000/64))) / 2;
3

4
else if(CONFIG.FREQ > 100 && CONFIG.FREQ <= 255)
5
  OCR1A = ((1/CONFIG.FREQ) / (1/(4000000/8))) / 2;
6

7
else if(CONFIG.FREQ < 255)
8
  OCR1A = ((1/CONFIG.FREQ) / (1/4000000)) / 2;
Gast #576068
Lesenswert?

Ich glaube schon:

1/(4000000/64)

müsste eigentlich eine Integeroperation sein, da kommt also Null raus.
Probier es mal mit:

((1.0/CONFIG.FREQ) / (1.0/(4000000.0/64.0))) / 2.0

CONFIG.FREQ muss ein Float sein.
#576072
Lesenswert?

Ich hab jetzt mal keine Ahnung, was CONFIG.FREQ ist, vermute aber eine 
Gleitkommavariable dahinter.

Fehler liegt z.B. hier:

1/(4000000/64)

Du dividierst 1 durch einen ziemlich großen Wert. Beides sind 
Ganzzahlen, das Ergebnis ist eine Ganzzahl und wird abgerundet, also auf 
0. Warum invertierst du die Zahl, um dann dadurch zu dividieren? Lass 
das 1/ und mach aus dem / davor ein *.
#576083
Lesenswert?

Anmerkung nebenbei...

Wäre es für deine Anwendung ungünstig, die Formel

((1/CONFIG.FREQ) / (1/(4000000/64))) / 2;

umzustellen als

(4000000/64)  2  CONFIG.FREQ;

? Ich denke das ist eher das, was du meinst, und die Konstanten am 
Anfang kann ein vernünftiger Compiler auch besser zusammenfassen.

Beschreibe doch mal, was CONFIG.FREQ ist (Ganzzahl, Fließkommazahl, in 
welchem Wertebereich).
#576098
Lesenswert?

Immer an Mathe denken: A/(1/B)==A*B
Das erste geht hier durch die Integerarithmetik schief, also warum die 
linke Seite verwenden, wenn die rechte besser geht? Denn die 
Spezialitäten der Integerarithmetik willst du ja eigentlich gar nicht.

Und die if-Abfragen würde ich noch einmal überarbeiten. Besonders das < 
in der letzten Abfrage sollte ein > sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren