Die Grundrechenarten in C [] (Die Grundrechenarten in C), Lektion, Seite 722922
https://www.purl.org/stefan_ram/pub/grundrechenarten_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

Grenzen der Größe und Genauigkeit in C 

Grenzen der Größe und Genauigkeit

Bei Rechnungen mit Zahlen kommt es in C  immer wieder zu Abweichungen von den schulmathematisch richtigen Ergebnissen . C -Implementationen rechnen also tatsächlich manchmal mehr oder weniger „falsch“! – jedenfalls verglichen mit den Erwartungen eines Lernenden. Tatsächlich richten sich C -Implementationen aber oft nach der Norm IEEE 754, nach welcher die Ergebnisse dann korrekt sind.

Die folgenden Ausgaben sind implementationsabhängig. Sie lassen sich daher nicht immer nachvollziehen, sind aber mit der C -Norm verträglich und erscheinen so unter vielen C -Implementationen.

main.c
#include <stdio.h>

int main( void )
{ printf
( "%d\n", 1000000 * 1000000 ); }
Konsole
main.c:3: warning: integer overflow in expression
stdout
-727379968
main.c
#include <stdio.h>

int main( void )
{ printf
( "%g\n", 0.1 + 0.1 + 0.1 - 0.3 ); }
stdout
5.55112e-17
main.c
#include <stdio.h>

int main( void )
{ printf
( "%g\n", 10000000000000000. + 1.
- 10000000000000000. ); }
stdout
0
main.c
#include <stdio.h>

int main( void )
{ printf
( "%d\n", ( 2147483647 + 1 ) ); }
Konsole
main.c:3: warning: integer overflow in expression
stdout
-2147483648
main.c
#include <stdio.h>

int main( void )
{ printf
( "%d\n", -( 2147483647 + 1 ) ); }
Konsole
main.c:3: warning: integer overflow in expression
stdout
-2147483648
main.c
#include <stdio.h>

int main( void )
{ printf
( "%g\n", 4.9E-324 ); }
stdout
4.94066e-324
main.c
#include <stdio.h>

int main( void )
{ printf
( "%g\n", 4.9E-324 / 2 * 2 ); }
stdout
0

Die Umstände, unter denen es zu solchen „Rechenfehlern“ kommen kann, müssen jedem ernsthaften Programmierer bekannt sein. Es wäre an dieser Stelle des Kurses aber noch zu früh, dieses Thema der möglichen Abweichungen vom mathematisch korrekten Ergebnis ausführlich zu behandeln. Vorläufig sollte man darauf achten, daß die Zahlen und die (Zwischen-)Ergebnisse bei Verwendung des Datentyps »int« nicht zu groß  werden (nicht größer als 30000 und nicht kleiner als -30000) und wissen, daß Ergebnisse vom Typ »double« in den hinteren Stellen  (ungefähr nach der 10. Stelle) vom korrekten Ergebnis abweichen können.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722922 stefan_ram:722922 Die Grundrechenarten in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722922, slrprddef722922, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/grundrechenarten_c