ubuntuusers.de

C++ Modulodivision

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

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 Team-Icon

Avatar von 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 Team-Icon

Avatar von 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 Team-Icon

Avatar von 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

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

Wohnort: Darmstadt

Die Loesung funktioniert nicht auf allen Maschinen.

tux21b Team-Icon

Avatar von tux21b

Anmeldungsdatum:
15. August 2005

Beiträge: 1698

Wohnort: Linz.at

@Apollon: Wieso nicht? Ich kann da nichts "plattformabhängiges" erkennen.

Apollon

Avatar von Apollon

Anmeldungsdatum:
27. Oktober 2004

Beiträge: 724

Wohnort: Darmstadt

sizeof()

tux21b Team-Icon

Avatar von 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

Avatar von 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 Team-Icon

Avatar von 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 Team-Icon

Avatar von 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

Avatar von 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? 😉

Antworten |