I <float.h> kan man se DBL_DIG der er decimale cifre i repræsentationen. Denne er 15 på min celeron. b er i ovenstående 1e-6, dvs. der bliver brugt langt fra 15 cifre....
Det må have noget at gøre med cout.precision. Hvis du prøver følgende:
#include <iostream>
void main(){ double a=2.0; double b=2.0/2000000.0000; double h=0.0; int i=0; while (i<2000000){ h+=b; i++; if (i % 100000 == 0) cout << h << \"\\n\"; } cout.precision(12); cout << h << \"\\n\";
}
ser du, at det sidste output i løkken er 2. Jeg er ikke en meget erfaren programmør, så jeg kan ikke give dig svar på, hvorfor der bliver afrundet så mystisk med cout.precision
Det er fordi, at den \"default\"\'e præsion på cout er 6 decimaler(ved mig ihvertfald, prøv at indsætte \"cout << cout.precision() << \"\\n\";\"). Dvs. med 6 decimaler er resultatet godt nok, hvilket vi ogsaa kan se ud fra resultatet med 12 decimaler. Men hvorfor resultatet ikke er rigtigt med 12 decimaler er liiiidt mærkelig.... (og uhyggeligt! Hvem vil sendes til månen af sådan en computer?)
Jeg har engang fået en artikel i hånden: \"What every computerscientist should know about floating point numbers\", men har desværre ikke læst den og kan ikke huske, hvor den er henne.
Grunden til at du ikke får det resultat du forventer skyldes kunne skyldes at du til \'h\' lægger \'b\' til 2000000 gange, dvs. den \'støj\' der ligger på den sidste decimaler i b bliver forstørret 2000000 gange, hvilket giver dig din manglende præsicion på 12. decimal
float og double følger IEEE 754 standarden. single precision (32 bit)(float) eller double precision (64 bit( (double) i single precision er benyttes bit\'ne som følger: 1 bit repræsenterer fortegnet. 8 bit repræsenterer Exponenten 23 bit repræsentere Fraction - delen
i 64 bit: 1 bit fortegn 13 Exponenten 52 bit Fraction dvs. den præcision du maks. kan opnå med float er 2^23 dvs. ca 6-7 betydende cifre. en double er præcisionen 2^53 ca. 15 cifre
haff >> Jamen, du skriver at man kan opnå 15 cifres præcision med en double, men madsen666\'s eksempel bruger doubles med 12 cifre, og er ikke præcist!?!?!?
Når jeg kompilerer eksemlet med præsition på 10, er resultatet rigtigt, men på 11 kommer der fejl!
Han forstørrer den usikkerhed der ligger på sidste ciffer ca. 2000000 gange, hvilket giver forkert decimal på 12. ciffer.
Prøv f.eks. i eksemplet at sætte her vil du sikkert på rigtigt resultat på 12 ciffer. /haff void main(){ double a=2.0; double b=2.0/200.0;// double h=0.0; int i=0; while (i<200){ h+=b;// i++; } cout.precision(12); cout << h << \"\\n\"; }
Okay Løsningen er at heletiden holde styr på antallet af betydende cifre! Jeg har tilføjet en måske lidt banal oprunding funktion, der sikre mig at jeg en præcision på med 14 betydende ciffer. her er hele koden. //precision.c #include <stdio.h> #include <stdlib.h> #include <string.h>
double runb14(double bel);
void main() { double a = 2.0; double b = 2.0/2000000.0; int i = 0; while(i<2000000) { h += b; h = runb14(h); i++; } printf(\"%0.15f\\n\",h);
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.