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.