Computer verrechnet sich

Gast #5796834
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.
Gast #5796844
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
#5796850
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.
Gast #5796863
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!?
Gast #5796880
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
Gast #5796888
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?
#5796895
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!
Gast #5796898
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.
#5799078
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.
#5799109
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.
Moderator #5799134
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 :-/
Gast #5799140
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren