Forum: PC-Programmierung Computer verrechnet sich


von Johnny W. (Gast)


Lesenswert?

Moin moin. Schaut euch mal folgenden C++ Code an:
1
#include <iostream>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <math.h>
5
6
  number = (log10(1 + 1) + 1);
7
  cout << "number = log10(1 + 1) + 1     =     " << number << endl;
8
9
  number = (3 - (log10(1 + 1) + 1));
10
  cout << "number = 3 - (log10(1 + 1) + 1)     =     " << number << endl;

Ausgabe:
1
number = log10(1 + 1) + 1     =     1
2
number = 3 - (log10(1 + 1) + 1)     =     1

Das bedeutet also 3 - 1 = 1. Das halte ich für Fake News, daher meine 
Frage, was hier der Grund für diesen Fehler sein könnte.

: Verschoben durch Moderator
von Udo S. (urschmitt)


Lesenswert?

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"

von Dirk (Gast)


Lesenswert?

Hallo,

das ist kein C++-Code. Welchen Typ hat denn "number"?!
Ich wette es handelt sich um einen ganzzahligen Typen,
was das Verhalten erklärt...

von Johnny W. (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

?‍♂

von Michael B. (laberkopp)


Lesenswert?

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.

von Bimbo. (Gast)


Lesenswert?

Ok, alle zurück zur Tagesordnung, hier gibt es NICHTS zu sehen, bitte 
weitergehen!

von Dr. Sommer (Gast)


Lesenswert?

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?

von Johnny W. (Gast)


Lesenswert?

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!?

von Dirk B. (dirkb2)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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

von A. S. (Gast)


Lesenswert?

Nur zur Entschleierung eine offensichtlichere Version:
1
#include <iostream>
2
#include <stdio.h>
3
#include <stdlib.h>
4
#include <math.h>
5
 
6
  number = 1.5;
7
  cout << "number = 1.5   = " << number << endl;
8
9
  number = 3-1,5;
10
  cout << "number = 3-1.5 = " << number << endl;
Ausgabe:
1
number = 1.5   = 1
2
number = 3-1.5 = 1

Und erneut die Frage: Was wollte uns der TO sagen?

von F. F. (foldi)


Lesenswert?

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!

von Johnny W. (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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

Hat sich mein Computer etwa anders verrechnet als deiner? Irgendwie sind
die Computer wohl auch nicht mehr das, was sie einmal waren ;-)

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Johnny W. (Gast)


Lesenswert?

Andreas S. schrieb:
> Also nur ein peinlicher Aufschneider, den die Welt nicht braucht.

Hässliche Fernsteuerungen braucht auch keiner.

von Eddy C. (chrisi)


Lesenswert?

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.

von Curby23523 N. (Gast)


Lesenswert?

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.

von Hotte (Gast)


Lesenswert?

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"

von Michael B. (laberkopp)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 :-/

von Dr. Sommer (Gast)


Lesenswert?

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?

von Der E. (rogie)


Lesenswert?

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

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

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...

von Oliver S. (oliverso)


Lesenswert?

Dann springe ich gleich mit, denn Header sind keine libs.

Oliver

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Über was du gerade genau gesprungen bist, merkst du, eventuell, erst 
später.

von Hotte (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.