PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Rechnung



bergowitch
05.03.2006, 21:22
Hallo,
ich bastel immer noch an meinem sound Problem.
Dafür brauch ich eine Rechnung:
Impulsanz_L = (2 * Ton * Zeit) / 1000;
Dabei habe ich Impulsanz_L als unsigned long definiert.
Ton hat in etwas einen Wert von 500 und Zeit 2000

Die Zeit wird in ms gemessen (und an die Funktion übergeben. Deswegen kann ich nicht direkt kürzen.

Wenn ich in s rechne (also der Faktor 1000 wegfällt) funktioniert meine Funktion.

Hat jemand eine Idee?
Gruß
Stefan

PasstScho
05.03.2006, 22:52
Hi,
sag doch mal welche Werte da für Zeit vorkommen.
MfG Alex

recycle
05.03.2006, 23:41
Dafür brauch ich eine Rechnung:
Impulsanz_L = (2 * Ton * Zeit) / 1000;
Dabei habe ich Impulsanz_L als unsigned long definier


"LONG" ist ein ganzzahliger Datentyp und verträgt sich nicht besonders gut mit mit deiner Division durch 1000.
Bei der Umwandlung in einen ganzzahligen Datentypen werden normalerweise alle Nachkommastellen einfach abgeschnitten und das Ergebnis dementsprechend ungenau.

bergowitch
06.03.2006, 06:40
Ja aber die Nachkommastellen sind für die Tonlänge ziemlich gleichgültig.
ich nehme für den Ton 500 (Hz also Frequenz) und für die Zeit 2000 (Millisekekunden also 2 Sekunden) Das Ergebnis sollte doch 2000 sein?
Gruß
Stefan

PasstScho
06.03.2006, 21:17
Hi,
Ja da sollte 2000 herauskommen.
Vielleicht hilft es wenn du
Impulsanz_L = (2L * Ton * Zeit) / 1000L; machst.
Und beim Avr sollte man diese int32_t bzw uint32_t statt long benutzen.
Ton und Zeit müssen natürlich auch diesen typ haben. Wenn nicht musst du
Impulsanz_L = (2L * (int32_t)Ton * (int32_t)Zeit) / 1000L; machen.

PS: und meine Erfahrung sagt: es liegt immer an dem, was man nicht vermutet ;)

MfG Alex

bergowitch
07.03.2006, 22:07
Hallo
PasstScho hat die Lösung gefunden. Die Lösung war
Impulsanz_L = (2L * Ton * Zeit) / 1000L; und uint32_t als Definition für Impulsanz_L hat geholfen.
Vielen Dank
Gruß
Stefan