Division by Zero

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.