Warum funktionert diese Berechnung im COde nur auf eine bestimmte Weise?



  • Hallo,
    Ich muss ein kleines Programm programmieren und es funktionert soweit auch tadellos.
    Jedoch ist mir eine Unstimmigkeit im Programm aufgefallen.

    Um Missverständnisse vorzubeugen, poste ich sicherheitshalber mal ein Link zum kompletten Programm:
    https://pastebin.com/Sf6w38Ka

    Es geht mir um die Zeile:

    V = 4 * PI * CUBE(radius) / 3

    Cube wurde vorher als Makro definiert und nimmt einfach den Radius zur 3ten Potenz.
    Berechnung des Volumens einer Kugel halt.

    SO funktioniert die Formel auch einwandfrei.
    Wenn ich jedoch schreibe:

    V = (4/3) * PI * CUBE(radius)
    Dann kommen nonsens Lösungen heraus.
    Wenn ich 10 für den Radius eingebe, kommen bei dieser Lösung 3141.59 heraus; was offensichtlich nicht stimmt.

    Woran kann das liegen?

    Mit freundlichen Grüßen



  • Das liegt daran, dass 4 und 3 ganzzahlige Konstanten sind und damit die Division 4/3 ebenfalls ganzzahlig durchgeführt wird -- das Ergebnis ist 1. Wenn du es so schreiben willst, musst du dafür sorgen, dass mindestens einer der Operanden eine Gleitkommazahl ist. Beispiel: V = (4.0 / 3) * PI * CUBE(radius)



  • Ich danke vielmals für die schnelle Antwort 🙂



  • @XLR8

    Cube wurde vorher als Makro definier

    Warum? Warum ist das keine Funktion?



  • @XLR8 sagte in Warum funktionert diese Berechnung im COde nur auf eine bestimmte Weise?:

    V = 4 * PI * CUBE(radius) / 3

    Noch die Erklärung warum der obere Ausdruck funktioniert:
    Da PI wohl eine Fließkommazahl ist und die Auswertung von links nach rechts erfolgt, ist der Rechentyp nach dem 4*PI double. Und dabei bleibt es dann.

    Nachtrag:
    Darum würde auch
    V = PI * 4/3 CUBE(radius) auch richtig rechnen.



  • @manni66 sagte in Warum funktionert diese Berechnung im COde nur auf eine bestimmte Weise?:

    @XLR8

    Cube wurde vorher als Makro definier

    Warum? Warum ist das keine Funktion?

    Die einzig relevante Frage... wer macht sowas??? 😱



  • @manni66 sagte in [Warum funktionert diese Berechnung im COde nur auf eine bestimmte Weise?]

    Warum? Warum ist das keine Funktion?

    Ich frage mich bei den vielen sehr ähnlichen Posts von Studenten hier, warum die Unis sich überhaupt die Mühe machen, den Leuten eine Programmiersprache beizubringen, wenn sie seit 30 Jahren dasselbe Programm runterspulen. Und sowas war schon vor 30 Jahren kein guter Stil.

    Aus Kommentar im Code: "Berechen Sie [...] Hierbei sollen die Konstanten und die Formeln für Square und Cube als Makros definiert werden" ... den Mist hat also offensichtlich der Prof/Assistent/Übungsleiter verbrochen.

    Bei uns waren alle Programmiersprachen-Kurse fakultativ, man hätte sich sowas also sparen können - das scheint bei vielen dieser "C-mit-Klassen"-Kursen, deren Opfer hier immer wieder aufschlagen, aber leider nicht der Fall zu sein 😞



  • Das liegt daran, dass das erste Thema in unserem Skript "Makros" ist.
    Wir Programmieren gerade alles mögliche mithilfe von Makros.

    Als nächstes kommen die Funktionen, dann werden wir ganz viel mit Funktionen machen.
    Ob es Sinn macht, will ich mir nicht anmaßen zu beurteilen.

    Mir geht es primär erstmal darum die Basics zu lernen. 🙂



  • @XLR8 Es macht keinen Sinn 🙂 Makros sind gut und schön, fügen sich aber nicht organisch in C++ ein und schießen überall quer. Alles was ohne Makros geht sollte man ohne Makros machen.

    Und was nicht ohne Makros geht, sollte man vielleicht gar nicht machen 😉



  • @Bashar man muss sie ja nicht benutzen.
    Aber lesen sollte man sie schon können.



  • @DirkB sagte in Warum funktionert diese Berechnung im COde nur auf eine bestimmte Weise?:

    Aber lesen sollte man sie schon können.

    Ja. Dazu gehören sie aber hinten ins Script, sicher nicht als das erste Thema.



  • Ich find's auch falsch Makros total zu ächten, man kann damit schon schöne Sachen machen die ohne Makros sehr viel blöder wären. Aber ich finds noch "falscher" sie zu verwenden wo es auch andere, bessere Möglichkeiten gibt.


Log in to reply