Johnny W. schrieb:> daher meine> Frage, was hier der Grund für diesen Fehler sein könnte.
Daß du nicht in dein C Buch geschaut hast.
Stichwort: "numerische Datentypen"
Stichwort2: "Ganzzahlen versus Gleitkommazahlen"
Die Fake News verbreitest du mit der Aussage:
"Computer verrechnet sich"
Ja korrekt, number ist bewusst als int gewählt. Aus C kenne ich es, dass
dabei alle Nachkommastellen verschluckt werden. Demnach wäre log(2) = 0.
Wenn man es als int castet int(log(2)) kommt natürlich das Richtige
raus.
Der Titel ist natürlich reiner Clickbait
Johnny W. schrieb:> Ja korrekt, number ist bewusst als int gewählt.
Ja nun, wer dumm ist, macht dumme Sachen.
Wenn Nachkommastellen abgeschnitten werden, können auch 0.999
abgeschnitten werden.
Toleranzen von +/-1 sind bei Ganzzahlen also nicht verwunderlich.
Zumal alles noch im Binärsystem gerechnet wird und mit transzendenten
Funktionen die sowieso keine auf 0.0000000000000000000000000000000001
exakten Ergebnisse liefern.
Johnny W. schrieb:> #include <stdio.h>
Warum C-I/O-Routinen?
> #include <stdlib.h>
Warum nicht der standardkonforme <cstdlib> Header, und wozu wird der
gebraucht?
> #include <math.h>
Warum nicht der standardkonforme <cmath> Header?
Dr. Sommer schrieb:> Johnny W. schrieb:>> #include <stdio.h>> Warum C-I/O-Routinen?>>> #include <stdlib.h>> Warum nicht der standardkonforme <cstdlib> Header, und wozu wird der> gebraucht?>>> #include <math.h>>> Warum nicht der standardkonforme <cmath> Header?
Habe nur die relevanten Stellen des Codes rauskopiert.
Also um noch mehr zu lernen als ich sowieso schon weiß - ich bin
weltweit für meine Übertreibungen bekannt - kann man also festhalten:
Um aus einem Float ein int mit allen Nachkommastellen eliminiert zu
erhalten, den int()-Cast verwenden!?
log10(1 + 1) ist aber double.
Darum ist das Ergebnis vom Ausdruck rechts vom = auch vom Typ double.
ERst dann wird der implizite cast nach int gemacht.
Johnny W. schrieb:> m aus einem Float ein int mit allen Nachkommastellen eliminiert zu> erhalten, den int()-Cast verwenden!?
Das hat noch diverse Nebenwirkungen (Überlauf). Casten wenn schon mit
static_cast<int>(floatWert) und nicht mit int(). Sinnvollerweise statt
"int" dann "std::int32_t" o.ä. verwenden, damit die Größe fix ist.
Für richtiges Runden siehe
https://en.cppreference.com/w/cpp/numeric/math/round
Michael B. schrieb:> Johnny W. schrieb:>> Ja korrekt, number ist bewusst als int gewählt.>
Wenn du einfach einmal solche Sätze weg lassen würdest,
> Ja nun, wer dumm ist, macht dumme Sachen.
wäre der Gegenwind für dich auch nicht immer so stark.
>> Wenn Nachkommastellen abgeschnitten werden, können auch 0.999> abgeschnitten werden.>> Toleranzen von +/-1 sind bei Ganzzahlen also nicht verwunderlich.>> Zumal alles noch im Binärsystem gerechnet wird und mit transzendenten> Funktionen die sowieso keine auf 0.0000000000000000000000000000000001> exakten Ergebnisse liefern.
Michael, ich lese deine Beiträge eigentlich ganz gerne, weil sie doch
von ziemlich viel Wissen geprägt sind. Du bist sicher ein schlaues
Kerlchen, aber andere sind auch nicht ganz doof. Vielleicht auf ganz
anderem Sektor.
Angenommen Johnny W. wäre Herzchirurg und du hättest einen Herzfehler
den er operieren könnte, wäre er dann immer noch so dumm für dich?
Michael, ich kenne sehr viele Ärzte und nur einen davon halte ich für
richtig intelligent.
Wenn er auch Chefarzt ist, ich kenne auch andere Chefärzte, die mir in
ganz vielen Bereichen nicht das Wasser reichen können, dennoch sind sie
in ihrem Fachbereich richtig gut.
Finde ich schade, dass du dir damit immer wieder ein Eigentor schießt,
denn eigentlich beantwortest du das doch letztlich sehr schön und
verständlich.
Ohne solche Sätze könnte man dich glatt als netten Kerl einstufen.
Wirklich schade!
A. S. schrieb:> Und erneut die Frage: Was wollte uns der TO sagen?
Da lade ich dich ein, eigene Interpretation zu entwickeln. Ob das
philosophische Debatten über das Leben, das Universum und den ganzen
Rest sind oder doch nur der Überwindung des Gefühls der Langeweile
dienen, bleibt dabei komplett Dir überlassen.
Johnny W. schrieb:> Also um noch mehr zu lernen als ich sowieso schon weiß - ich bin> weltweit für meine Übertreibungen bekannt
Also nur ein peinlicher Aufschneider, den die Welt nicht braucht.
Ich finde es schade, dass eine eigentlich lehrreiche Anfrage so
fertiggemacht wird.
Im Prinzip könnte man den Sachverhalt bzw. das Problem auf so viele
anschauliche Weisen darstellen, aber die Antworten gehen dann erst mal
in die Richtung:
- Du bist dumm
- Tue halt das Richtige, dann funktioniert es auch
Ich sehe da null Verständnis und auch nicht die Bereitschaft, sich auf
das Problem einzulassen.
Es ist die klassische Mikrocontroller-Tretmühle:
- Einsteiger stellt Frage
- Pöbel gibt herablassende und gemeine Antworten
- Einsteiger darf ab jetzt keinen Fehler mehr machen: einmal
zurückgeschossen, ist die Katze im Sack und man diskutiert nur noch,
warum der Einsteiger keine "Hilfe" annehmen will.
Ich fordere mehr Einfühlungsvermögen und weniger Selbstdarstellung!
Pauschal jede Anfrage zu verdammen ist unrichtig. Verwunderlich auch,
warum eine Frage "nicht lesenswert" sein kann. Dabei ist doch bekannt,
dass es keine dummen Fragen, sondern nur dumme Antworten gibt. Beste
Beispiele siehe oben.
Eddy C. schrieb:> Im Prinzip könnte man den Sachverhalt bzw. das Problem auf so viele> anschauliche Weisen darstellen, aber die Antworten gehen dann erst mal> in die Richtung:>> - Du bist dumm> - Tue halt das Richtige, dann funktioniert es auch
Zeitgeist.
F. F. schrieb:> Ohne solche Sätze könnte man dich glatt als netten Kerl einstufen.
Ohne solche Sätze würde er aber seinem Ruf als Laberkopp nicht mehr
gerecht werden.
"nomen est omen"
Dr. Sommer schrieb:>> #include <stdlib.h>> Warum nicht der standardkonforme <cstdlib> Header, und wozu wird der> gebraucht?>>> #include <math.h>> Warum nicht der standardkonforme <cmath> Header?
Au weia, da hat einer aber C++ gar nicht verstanden.
Warum überhaupt C++ für Dinge die keine ++ Features benötigen ?
Nur um sich den Overhead und die Beschränkungen einzufangen ?
Ja, wenn man als Programmierstil Exceptions haben will, dann braucht man
mehr als einfaches C, denn sonst würden beim Verlassen von Blöcken durch
eine Exception (in altem C: longjmp) eventuell dynamisch angelegte
Speicherblöcke nicht mehr freigegeben, Files nicht geschlossen,
Resourcen nicht freigegeben. Also braucht man Destruktoren die
automatisch aufgerufen werden. Also muss man an den Datentypen Methoden
drantackern können und braucht Klassen statt einfacher structs (so bald
eine struct einen pointer oder einen Verweis auf einer Resource
enthält). Und für solche Datentypen braucht man dann einen ganzen Satz
an neuen Funktionen, die statt Standardtypen eben Klassen akzeptieren,
um genau diese Methoden zum Anlegen/Kopieren/Freigeben aufzurufen, bzw.
exceptions zu werfen statt return-codes zu liefern. Daher gibt es in C++
fast die ganze Systembibliothek doppelt, ein mal für einfache Typen, ein
mal für Klassen. So lange man aber einfache Typen hat, braucht man keine
der neuen Funktionen, sie produzieren nur Overhead und Einschränkungen.
Beispiel: Versuche mal eine mit einer Klassenfunktion angelegte Datei
ordentlich zu locken (C Funktion flock), wie es bei jedem seriösen
dateiverarbeitenden Programm nötig ist. Dazu sagt C++ nur 'können wir
nicht (man bekommt nicht mal die handle aus einem stream)', also
disqualifiziert sich C++ für jede seriöse dateibasierte Programmierung.
Ja, es gibt Sprachen in denen es diese Zweigleisigkeit nicht gibt, wie
Smalltalk, die aber für ihre Langsamkeit berüchtigt sind.
Michael B. schrieb:> Au weia, da hat einer aber C++ gar nicht verstanden.
Au weia, das sagt gerade der Richtige.
In deinem Text ist so ziemlich alles, aber wirklich alles falsch, so
dass ich mir eine Aufzählung der einzelnen Punkte erspare. Ich weiß,
dass du fundierte Kenntnisse in der Elektronik hast. Aber fast alles,
was du zum Thema Software, und generell fast alles, was du unter deiner
Spezialmarke "laberkopp" von dir gibst, entspricht in keiner Weise
deinen sonstigen Qualitätsstandards. Warum tust du das überhaupt?
Weil dir langweilig ist? Um die Leute zu verdummen?
Entschuldige die harten Worte, aber dfas musste einfach mal gesagt
werden :-/
Michael B. schrieb:> Au weia, da hat einer aber C++ gar nicht verstanden.
Ja, und er heißt Michael. Der C++ Standard schreibt vor, dass ein System
die Header <cmath> & Co haben muss. Die C-Header <math.h> können
optional aus Abwärtskompatibilitätsgründen unterstützt werden, müssen
aber nicht. Daher sollte man zweckes Portabilität die vom Standard
garantierten Header der Form <cmath> nutzen. Das hat nichts mit
Exceptions oder Klassen zu tun.
Michael B. schrieb:> Nur um sich den Overhead und die Beschränkungen einzufangen ?
Welcher Overhead?
Michael B. schrieb:> (C Funktion flock)
Das ist keine C-Funktion sondern eine UNIX-Funktion. Die wird weder vom
C-Standard noch vom C++-Standard unterstützt. Die ist nichtmal in POSIX
spezifiziert (laut man-Page jedenfalls).
Michael B. schrieb:> wie es bei jedem seriösen> dateiverarbeitenden Programm nötig ist
Nach der Logik kann man nur unter manchen UNIX-Systemen "seriös"
programmieren, welche zufällig ein flock bieten.
Warum sollte C++ eine Funktion spezifizieren, welche nur auf einigen
Systemen und nichtmal in Standard-C verfügbar ist?
Yalu X. schrieb:> A. S. schrieb:>> Ausgabe:>> number = 1.5 = 1>> number = 3-1.5 = 1>> Mein Computer gibt folgendes aus:>>>
1
> number = 1.5 = 1
2
> number = 3-1.5 = 2
3
>
>> Hat sich mein Computer etwa anders verrechnet als deiner? Irgendwie sind> die Computer wohl auch nicht mehr das, was sie einmal waren ;-)
Also, meiner gibt da 42 aus :-D
Und jetzt könnt ihr euch wieder ewig dran hochziehen das der TE C-Libs
in nem C++ Quelltext benutzt hat. Ihr springt aber auch echt über jedes
Stöckchen...
Tim T. schrieb:> Über was du gerade genau gesprungen bist, merkst du, eventuell,> erst später.
Hast du nicht noch ein paar Kommata vergessen?
Es ist noch nicht hinter jedem Wort eins.
Manche Leute setzen gar keine, du hingegen verteilst sie reichlich...
scnr
Hotte schrieb:> Hast du nicht noch ein paar Kommata vergessen?
Man könnte die Kommata um "eventuell" durch Gedankenstriche ersetzen.
Das ist aber eher kosmetischer Natur, falsch ist keines der Kommata.