2012-04-04 6 views
1

Mögliche Duplizieren:
Is JavaScript's Math broken?
Dealing with accuracy problems in floating-point numbersGarbage-Bits in der Gleitkommadarstellung von Zahlen in C/C++ Programm

den Code Betrachten unten und seine Ausgabe:

#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <cmath> 
#include <limits> 
#include <vector> 


int main(int argc, char *argv[]) 
{ 
    double xleft = 0; 
    double xright = 1.0; 

    double dx = 0.1; 
    std::cout << std::setprecision(36) << "dx is " << dx << std::endl; 

    int numgridpts = ((int) ceil ((xright - xleft)/dx)) + 1; 


    for (int i = 0; i < numgridpts ; ++i) 
    { 
     std::cout << std::setprecision(36) << xleft + i*dx << std::endl; 
    } 

    return 0; 
} 

[~:ICgen/$ ./a.out                                
dx is 0.100000000000000005551115123125782702 
0 
0.100000000000000005551115123125782702 
0.200000000000000011102230246251565404 
0.300000000000000044408920985006261617 
0.400000000000000022204460492503130808 
0.5 
0.600000000000000088817841970012523234 
0.700000000000000066613381477509392425 
0.800000000000000044408920985006261617 
0.900000000000000022204460492503130808 
1 

Meine Frage ist, wenn ich o drucke ut die Zahlen bis zu einer Genauigkeit von 36 Bit, warum sind die Zahlen, 0, 0,5 und 1,0 genau dargestellt, wo die anderen Zahlen scheinen einige Müllnummern am Ende platziert haben?

Auch wenn ich die Fließkommadarstellungen von 0,2 und 0,1 wie in der obigen Ausgabe gezeigt hinzufügen, scheinen sie nicht zu der Darstellung von 0,3, in dem Teil der Garbage-Bits hinzuzufügen.

I Linux Ubuntu 10.10 und den GCC Compiler verwende

+5

Sie erhalten etwa 10 Antworten in 3 ... 2 ... 1 ... (das alles wird Ihnen sagen, dass Fließkomma-Arithmetik nicht immer genau eine gegebene Dezimalzahl darstellen kann). –

+2

"Fließkomma-Arithmetik kann nicht immer genau eine gegebene Dezimalzahl darstellen" –

+0

@Eric J. Dann warum sind 0,5, 1 und 0 genau oben dargestellt? – smilingbuddha

Antwort

5

Diese sind nicht Zahlen, sondern garbage wie genaue Werte dieser Zahlen wie möglich innerhalb der Gleitkomma-Darstellung nach dem IEEE 754-Standard.

Dieser Standard verwendet Binärzahlen, keine Dezimalzahlen. Daher werden Brüche wie 1/2, 1/4, 1/8 (= 0,5, 0,25, 0,125, ...) und ihre Vielfachen genau dargestellt, während Brüche wie 1/3 oder 1/10 nicht genau sind.

Wenn dies ein Dezimalziffernsystem wäre, wären Brüche wie 1/10, 1/100, 1/1000 ... und deren Vielfache die einzigen Zahlen, die genau mit einer endlichen Anzahl von Ziffern dargestellt werden.

In beiden Systemen werden alle Ganzzahlen genau dargestellt, wenn sie nicht extrem groß sind.