"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Modulo nachprogrammieren

sliver33 11.02.2005 - 16:18 6291 25
Posts

sliver33

Big d00d
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
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
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
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
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
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

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25422
Zitat
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; :confused:

edit: j2me wofür?

smashIt

master of disaster
Avatar
Registered: Feb 2004
Location: OÖ
Posts: 5214
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
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
Zitat von sliver33
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
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
Zitat von mat
float mod = n1 % n2; :confused:

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
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
Zitat von xdfk
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
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
Zitat von sliver33
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
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
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
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
Zitat von sliver33
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 :)

muss ich jetzt meine diskrete math. unterlagen ausgraben um es dir zu beweisen? ;)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
ähm sliver

ist dir schon mal der gedanke gekommen dass der TI nen Bug haben könnte?

xdfk

pädagogisch wertvoll
Avatar
Registered: Sep 2000
Location: Graz
Posts: 6441
Zitat von watchout
ä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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Zitat von xdfk
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
Avatar
Registered: Sep 2001
Location: Alkoven
Posts: 273
ä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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz