Division by Zero

OP
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
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.
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 *.
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).
Gast
Es müsste doch reichen, die 4Mio. als "long" zu kennzeichnen ("L" 
anhängen), oder? (besser als zu 'riskieren', dass die Float-Berechnung 
nicht wegoptimiert wird)
hth. Jörg
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.