arthur
Anmeldungsdatum: 26. April 2005
Beiträge: 78
|
Hey Leutz, bin ein C++ Anfänger und arbeite mich zur Zeit in die Sprache ein. Hab eine saublöde Frage 😳 . Die Modulodivision gibt den Rest einer Division ganzer Zahlen. Also ergibt:
9.0/7.0 == 1.2857 9/7 == 1 9%7 == 2
Soweit so gut. Aber warum ergibt:
11%4 == 3
Gruß & Dank Arthur
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
11 / 4 = 2 2*4 = 8 3 Rest Der Modulo-Operator gibt immer den Rest zurrück und wenn man 11 mit 4 dividiert, bleiben halt 3 Rest... 😉 Mit diesem Operator kann übrigens sehr leicht überprüft werden ob eine Zahl gerade oder ungerade ist: if ((zahl % 2) == 0) {
// Die Zahl ist gerade
} else {
// Die Zahl ist ungerade
}
|
arthur
(Themenstarter)
Anmeldungsdatum: 26. April 2005
Beiträge: 78
|
Ahhhhhhhmmmmmmmmm der REST nicht die Nachkommastelle 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳 😳
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
Naja, kann jedem einmal passieren... 🤣
|
JuergenF
Anmeldungsdatum: 22. Oktober 2004
Beiträge: 2009
Wohnort: FFM
|
Als kleine Aufgabe hintendran 😉 Wie kommt man denn nun an die 1. Nachkommastelle? Baukasten: 1001*%(int)()
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
Es entspricht zwar nicht deinem Baukasten und mit dem Modulo-Operator hat es auch nur wenig zu tun, aber es ist wenigstens einmal eine Lösung! float x = 13.98f;
int n = ((int)(x*10)) - (((int)x)*10);
printf("Die Erste Nachkommastelle von %f ist %d\n", x, n);
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
Die Loesung funktioniert nicht auf allen Maschinen.
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
@Apollon: Wieso nicht? Ich kann da nichts "plattformabhängiges" erkennen.
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
Apollon: Bitte poste eine etwas genauere Begründung. Es ist doch egal wieviel Speicher jetzt der Integer-Wert belegt, da die Zahlen im Beispiel eh relativ klein sind.
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
sizeof(int) ist nicht immer gleich sizeof(float). Haengt von der Implementierung ab. Wenn Du also von float nach int castest, verlierst Du moeglicherweise signifikante Bits. http://www.weblearn.hs-bremen.de/risse/CNAPS/floats/floats.htm hat geschrieben: 4.7. Umwandlung Fließkomma zu Integer Bei der Umwandlung von Fließkommazahlen in Integerzahlen muß der Exponent auf den Wert 23 gebracht werden (vergl. Abbildung 5). Ist der Exponent 23, so können die unteren 16 Bit der Mantisse direkt als Integerzahl betrachtet werden. Bei diesem Verfahren werden mögliche Überläufe nicht beachtet. Die Fließkommazahl 1.0 * 223 würde die Integerzahl 0 zurückliefern. Die 24 Bit Mantisse würde ohne jede Veränderung als Integerzahl angesehen werden und ihre unteren 16 Bit würden das Ergebnis bilden.
|
JuergenF
Anmeldungsdatum: 22. Oktober 2004
Beiträge: 2009
Wohnort: FFM
|
So ganz konkret verwirrt ihr den armen arthur aber erstmal, oder? 😉 War gar nicht so gedacht. @arthur: vergiss die beiden erstmal. Du darfst zu meinem Baukasten auch was hinzufügen, aber mit modulo solls sein...
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
Apollon: Du hast recht dass mit der Umwandlung natürlich ein Verlust entsteht. Das ganze bessert sich vielleicht ein wenig wenn man einen Double-Wert nimmt, die optimale Lösung ist das dann aber auch noch nicht. Wenigstens hab ich einmal eine Lösung gefunden die (zumindest mit kleinen Zahlen) funktioniert. Jetzt bin ich aber einmal auf eure Vorschläge gespannt!
|
tux21b
Anmeldungsdatum: 15. August 2005
Beiträge: 1698
Wohnort: Linz.at
|
Hier ist nocheinmal eine Lösung (mit dem Modulo-Operator)! float x = 13.98f;
int n = ((int)(x*10)) % (((int)x)*10);
printf("Die Erste Nachkommastelle von %f ist %d\n", x, n); Das ganze ist im Prinzip aber wieder genau das gleiche wie vorher. Also es wird auch wieder float zu int konvertiert.
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
Hey hey tux123! Das war kein Angriff, nur ein Hinweis. Willst Du noch einen? Wer sagt, dass die Stelle ein int sein muss? JurgenF? 😉
|