Modulo nachprogrammieren
sliver33 11.02.2005 - 16:18 6291 25
sliver33
Big d00d
|
Müsste die Modulo funktion für negative Fließkommazahlen nachprogrammieren. Weiß zufällig wer wie das geht? ... Für positive Ganzzahlen is ja einfach aber wei schauts mit negativen Zahlen aus?
tia Sliver
|
xdfk
pädagogisch wertvoll
|
modulo fuer flieszkommazahlen? in assembler oder wo liegt das problem? negativ oder positiv is modulo relativ egal wennst mich fragst. zahl x durch y dividieren = erg(ganzzahlig) x - erg * y = modulo oder so aehnlich, hab weder zeit noch lust mir das genauer anzuschauen man nehme papier und bleistift und teste anhand einfacher beispiele
|
sliver33
Big d00d
|
Oder man nimmt TI-89 und vergleicht das ergebnis mit dem ergebnis aus der rechnung x - erg*y = modulo. Und das gilt leider nicht bei negativen fließkomma zahlen.
Ich brauchs übrigens in JAVA (J2ME) und da gibts leider keine Fließkommazahlen. ==> andere Klasse verwenden die hat aber leider keine modulo funktion ==> @#!?!
|
mat
AdministratorLegends never die
|
Ich brauchs übrigens in JAVA (J2ME) und da gibts leider keine Fließkommazahlen. ==> andere Klasse verwenden die hat aber leider keine modulo funktion ==> @#!?! float mod = n1 % n2; edit: j2me wofür?
|
smashIt
master of disaster
|
modulo is ja einfach nur der rest der division
float zaehler=..., nenner=..., ergebnis, modulo; ergebnis=zaehler/nenner; modulo=zaehler-nenner*(int)ergebnis;
oder alternativ modulo=nenner*(ergebnis-(int)ergebnis);
sollten beide das selbe ausspucken wenn ich mich nicht irr...
|
xdfk
pädagogisch wertvoll
|
Oder man nimmt TI-89 und vergleicht das ergebnis mit dem ergebnis aus der rechnung x - erg*y = modulo. Und das gilt leider nicht bei negativen fließkomma zahlen.
Ich brauchs übrigens in JAVA (J2ME) und da gibts leider keine Fließkommazahlen. ==> andere Klasse verwenden die hat aber leider keine modulo funktion ==> @#!?! ich seh den wald vor lauter baeumen nicht: wo liegt das problem? (c++ bsp) float x = -23.5; float y = 10; int tmp = x/y; float result = x - y*tmp; std::cout<<"result "<<result<<std::endl; sollte imho das richtige ausgeben: -3,5 bzw was ist laut deinem taschenrechner das richtige ergebnis? und wenn du schon so toll sagen kannst dass es falsch ist WO genau liegt der fehler? ich hab mich ehrlich gesagt noch nie mit negativen modulo operationen auseinandergesetzt deswegen check ich net ganz was du meinst, maybe hast du das ganze nur falsch interpretiert? weil das -3,5 % 10 kannst du klarerweise auch als 6,5 interpretieren. um diese tageszeit in dem zustand is aber selbst so primitive mathematik nimmer das wahre
|
xdfk
pädagogisch wertvoll
|
float mod = n1 % n2;
edit: j2me wofür? wobei ich bin mal davon ausgegangen dass der lerneffekt darin liegen soll dass die kiddies den modulo operator selber ausprogrammieren
|
sliver33
Big d00d
|
wobei ich bin mal davon ausgegangen dass der lerneffekt darin liegen soll dass die kiddies den modulo operator selber ausprogrammieren Is keine Aufgabe fürs Studium sondern brauch ich selbst für ein Programm. @mat: in J2ME (das is das für die Handys ) gibts keine floats als Primitive Datentypen. Wenn man die trotzdem braucht muss man auf Klassen zurück greiffen die die ganze Berechnung mit ints lösen. Und dann schreibt man z.B. Float a = new Float(2, -1); // 2*10^-1 Float b = new Float(3, -2); a = a.Add(b); Und mein Problem ist nun das ich nicht a.Mod() schreiben kann weil die Klasse die ich verwende keine Modulo Operation implementiert hat. Back to topic: Laut TI-85: 5%10: mod(5,10) = 5 23.5%10: mod(23.5,10) = 3.5 -23.5%10: mod(-23.5,10) = 6.5 <----- -5%7: mod(-5,7) = 2 Was mich auf folgenden normalen Java code bringt: public float mod(a, b) { int tmp = a/b; float m = Math.abs(a)-tmp*b; if(a<0) return b-m; else return m; } Hmmm ich glaub so müssts funktionieren. Was sagt ihr dazu?
|
xdfk
pädagogisch wertvoll
|
Back to topic: Laut TI-85: 5%10: mod(5,10) = 5 23.5%10: mod(23.5,10) = 3.5 -23.5%10: mod(-23.5,10) = 6.5 <----- -5%7: mod(-5,7) = 2
Was mich auf folgenden normalen Java code bringt:
public float mod(a, b) { int tmp = a/b; float m = Math.abs(a)-tmp*b; if(a<0) return b-m; else return m; }
Hmmm ich glaub so müssts funktionieren. Was sagt ihr dazu? ich kann dir jetzt zwar nicht sagen ob dein java code stimmt, musst du ausprobieren. immerhin meine theorie scheint wenigstens richtig gewesen zu sein
|
sliver33
Big d00d
|
eigentlich nicht xdfk ... weil ja nicht -3.5 sondern 6.5 rauskommt Java Code stimmt übrigens . Hab grad a paar Tests gmacht für mich scheint des zu funktionieren
|
xdfk
pädagogisch wertvoll
|
|
watchout
Legendundead
|
ähm sliver
ist dir schon mal der gedanke gekommen dass der TI nen Bug haben könnte?
|
xdfk
pädagogisch wertvoll
|
ähm sliver
ist dir schon mal der gedanke gekommen dass der TI nen Bug haben könnte? kein bug eher mehrere moegliche loesungen zu einem beispiel! der TI zeigt eben nur eine davon an. wie es wirklich mathematisch korrekt ist muesste ich nachlesen aber ich bin mir ziemlich sicher dass beides moeglich ist, wobei es dann sicher wieder davon abhaengt wo man nachliest.....
|
watchout
Legendundead
|
kein bug eher mehrere moegliche loesungen zu einem beispiel!
der TI zeigt eben nur eine davon an. sicher? Glaub ich nämlich nicht, weil der TI einfach nach der Formel n-m*int(n/m) rechnet,ich kann da nichts sehen was mir mehrere ergebnisse liefert...
|
sliver33
Big d00d
|
ähm ich glaub das ma dem TI schon vertrauen kann.
Aber nachdem ich was nachprogrammiert hab und jetzt immer das selbe rauskommt, passts für meine Fall und damit bin ich zufrieden.
@xdfk: Wenns nicht zu aufwändig ist würd mich des schon intressieren dast die math. unterlagen ausgrabst. Möchat wirklich wissen warums da zwei unterschiedliche Lösungen gibt.
|