Avatar billede Lasse Novice
08. september 2004 - 00:51 Der er 10 kommentarer og
2 løsninger

Fejl i double udregning?

Jeg har to double vaerdier:

double min = -2.34269;
double max = 2.342691;

Jeg finder midt punktet:

double med = (min + max) / 2;

Jeg ville nu regne med at med ville vaere 0.000005 men det er den ikke, den er istedet 0.0000004955481815233 eller noget i den retning. Det tyder jo paa for faa bit, men der staar i dok at den er praecis optil 15 - 16 bit....

Er min computer blevet syg, eller hvad sker der?
Avatar billede kabbak Professor
08. september 2004 - 01:13 #1
Jeg har lige testet i Excel, jeg får 0.000005

Der var engang nogle cpu'er der havde en lille regnefejl, jeg kan bare ikke huske hvilken.

Vi fik dem i et parti nye computere, for en 3 - 4 år siden, men vores forskere faldt over regnefejlen, og klagede, så de blev byttet.
Avatar billede kabbak Professor
08. september 2004 - 01:29 #2
hvis du har overclockning, kan den også regne forkert.


http://hosted.dailyrush.dk/boards/1412/topics/24018/
Avatar billede Lasse Novice
08. september 2004 - 01:43 #3
Ups, i min post, der skrev jeg 15 - 16 bit... det var forkert. Det er 15 - 16 decimal

Jeg tror ikke det har noget med det at goere, eftersom der er flere end min computer paa arbejdet der har samme problem.

Vaerdien er helt praecist:

0.00000049999999984784438

Som man kan se, er det faktisk ude paa det 15 - 16 decimal det gaar galt, saa det er rigtigt hvad de skriver. Jeg kan bare ikke se hvad mine to vaerdier har med saa mange decimaler at goere....?????????????!!!!!!!!!!!!!!1
Avatar billede eagleeye Praktikant
08. september 2004 - 09:11 #4
Excel viser kun 0.0000005 fordi du ikke har valgt nok decimaler jeg kan også få excel til at vise 4,99999999847844000000000E-07

Problemet er at "uendeligt" mange tal skal skrives som X antal bit (x=32 eller x=64 x=128 alt efter type). Det gør at ikke alle tal kan skrives helt præsist. I en computer er der er ikke et binært tal for hver tal i virkeligheden. Det som styre det er væriden af det mindst betydne bit (LSB).
Avatar billede kabbak Professor
08. september 2004 - 09:15 #5
jeg viste på 10 decimaler, for at være sikker, der var kun nuller efter 5 tallet
Avatar billede chries Nybegynder
08. september 2004 - 11:03 #6
ved ikke om det gør en forskel, men prøv:

double med = (min + max) / (double)2;
Avatar billede clausc Nybegynder
08. september 2004 - 12:12 #7
Typen double gør egenlig som den skal. Hvis afrunding er vigtig så brug decimal:

decimal dc_min = new decimal(-2.34269);
decimal dc_max = new decimal(2.342691);
decimal dc_med = (dc_min + dc_max) / new decimal(2.0);
Avatar billede arne_v Ekspert
08. september 2004 - 12:38 #8
For lige at bygge lidt videre på noget af det der allerede er skrevet.

en floating point (float og double i C#) er gemt som:

2^a * (1 + b1/2 + b2/4 + b3/8 + ...)

det betyder at ikke bare kan ikke alle tal repræsenteres eksakt men at
det er meget sjældent at decimaler kan repræsenteres eksakt da det bruges
1/2, 1/4, 1/8 etc. og ikke 1/10, 1/100, 1/100 etc..

Floating point er beregnet til fysiske størrelser med naturlig usikkerhed.

Jeg har 45 km til arbejde. Jeg har ikke 44.99999732 km til arbejde, fordi det giver
ingen mening at angive den afstand med den præcision.

Beløb og lignende skal normalt angives eksakt.

Derfor er der døds straf for at bruge floating point (float og double i C#)
til beløb.

Løsningen er det som hedder fixed point. Som er en eksakt data type med
et fast antal decimaler. Den er decimalt orienteret ikke binært orienteret
og kan repræsentere alle værdier indenfor range med det antal decimaler.
I sin mest primitive form gemmer man bare en integer og antal decimaler
således at 123 og 2 betyder 1.23 !

C# har indbygget en data type for det som hedder decimal.

Og jeg ville skrive decimal versionen som:

decimal min = -2.34269m;
decimal max = 2.342691m;
decimal med = (min + max) / 2;

m for decimal
Avatar billede arne_v Ekspert
08. september 2004 - 12:40 #9
chries>

double / int laver automatisk en konvertering fra int til double inden
division
Avatar billede Lasse Novice
08. september 2004 - 17:08 #10
mange tak skal i have alle sammen.

Jeg skulle mene at clausc var ude foerst.
Avatar billede clausc Nybegynder
08. september 2004 - 18:40 #11
Takker. Jeg deler gerne :)
Avatar billede arne_v Ekspert
08. september 2004 - 18:45 #12
.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Cyberdivisionen søger AI forretningskonsulent i Ballerup

Lægemiddelstyrelsen

Løsningsarkitekt

Netcompany A/S

Test Consultant

Politiets Efterretningstjeneste

AI/ML udvikler i PET

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Afdelingschef til GDPR & Tech Regulation