Datamaskiner kan kjempe for å vise intelligent oppførsel, men blindt utført aritmetiske beregninger er sikkert deres forte. Eller er det?

Feil av Googles online kalkulator og Excels tilsynelatende manglende evne til å gi riktige svar på enkle beregninger, er begge kjente problemer blant programmerere, men disse er egentlig ikke feil i ordets normale forstand. I stedet er de bare en konsekvens av det faktum at datamaskiner suger på matte.

Datamaskiner utfører beregninger på en helt annen måte enn de metoder som mennesker bruker til å gjøre aritmetikk - og det betyr at de vanligvis kommer opp med feil svar. Her undersøker vi noen av de sjokkerende konsekvensene av denne åpenbaringen, før du drar inn i grunnen til at datamaskiner suger på matte.

  • 10 databehandling konspirasjonsteorier undersøkt

Lukk er ikke nær nok

For alle som fortsatt er overbevist om at datamaskiner ikke kan få enkel aritmetisk rett, la oss starte med noen få eksempler på at du kan prøve deg selv.

Først opp, Googles kalkulator. Hvis du aldri har prøvd det før, for å få en følelse av hvordan det fungerer, surfe til www.google.co.uk, skriv 5 * 9 + (sqrt 9) ^ 3 i søkeboksen og klikk på 'Søk' . Du finner at det kommer tilbake med det riktige svaret: '5 * 9 + (sqrt 9) ^ 3 = 72'.

La oss nå prøve en annen beregning. Skriv inn 599.999.999.999.999 - 599.999.999.999.998. Ganske tydelig, dette bør gi et svar på 1. Utrolig, men Google reagerer med dette: '599,999,999,999,999 - 599,999,999,999,998 = 0'. Bare et sjeldent og uheldig eksempel, kanskje?

OK, la oss prøve en annen enkel beregning. Skriv = 850 * 77,1 i celle A1 i en Excel 2007 arbeidsbok (det virker ikke - eller skal det være det fungerer - i tidligere versjoner av Excel). En bit av mental aritmetikk antyder at svaret burde være i området 60.000; faktisk er det riktige svaret 65.535.

Excel har andre ideer. Det vil fortelle deg at resultatet av denne multiplikasjonen er 100.000, som er ute av en massiv 34.465. Og for å bevise at dette ikke er noe flash i pannen, hva med å bruke et utvalg av online kalkulatorer til å trene 1,0 - 0,9 - 0,1?

Du vil sikkert finne at minst halvparten av dem vil komme opp med et svar på -2.77555756 E-17 - Vitenskapelig notasjon for -0,0000000000000000277555756. (Hvis alle de du prøver å gi det riktige svaret, ta en titt på www.calculator.net.)

Dårlig mat: Siden 1,0 - 0,9 - 0,1 er 0, hvorfor er så mange online kalkulatorer overbevist om at denne verdien er svaret i stedet?

OK, dette svaret er kanskje ikke langt fjernet fra det riktige svaret på 0, men hvorfor kan ikke kalkulatoren komme med det riktige svaret - et svar som er åpenbart åpenbart for alle som er kjent med enkel aritmetikk?

Hvordan datamaskiner gjør matte

Selv om datamaskiner kan håndtere heltall (hele tall), for alminnelig aritmetikk lagrer de tall i flytende punktformat fordi det er så mye mer effektivt i minnebruk.

La oss ta det dobbelte presisjons flytpunktspresentasjonen som et eksempel. Den bruker 64 bits for å lagre hvert tall og tillater verdier fra ca -10308 til 10308 (minus og pluss 1 etterfulgt av 308 nuller, henholdsvis) som skal lagres. Videre kan fraksjonelle verdier så små som pluss eller minus 10-308 (det er et desimaltegn etterfulgt av 307 nuller og deretter en 1) lagres.

I motsetning til at hvis de samme 64 bitene ble brukt til å lagre heltall, ville rekkevidden være −9,223,372,036,854,775,808 til +9,223,372,036,854,775,807, og fraksjonelle verdier kunne ikke representeres.

Hemmeligheten til denne tilsynelatende fantastiske effektiviteten er tilnærming. Av de 64 bitene representerer man tegnet (så om verdien er positiv eller negativ), 52 bit representerer mantissaen (det er de faktiske tallene) og de gjenværende 11 bitene representerer eksponenten (hvor mange nuller er der eller hvor desimalpunktet er).

Så selv om et mye større antall tall kan lagres ved hjelp av flytende punktnotasjon, er presisjonen faktisk mindre enn det som kan oppnås i heltallformat, siden bare 52 bits er tilgjengelige. Faktisk representerer 52 biter av binær informasjon et 16-bit desimaltall, så alle verdier som bare er forskjellig i deres 17. desimalpunkt, vil faktisk bli sett på som identiske.

Situasjonen med Google tenker at 599.999.999.999.999 - 599.999.999.999.998 er lik 0, men det er tydelig at Googles kalkulator faktisk bruker mindre enn de vanlige 52 bitene til mantissaen. At noen kalkulatorer gir et nullresultat til beregningen 1.0 - 0.9 - 0.1 kan virke annerledes siden vi ser ut til å være ingen steder nær grensen til 64-biters flytende punkt aritmetikk.

Men det er å glemme et viktig faktum - at datamaskiner fungerer i binær. Og selv om 0,1 kanskje bare har ett signifikant siffer i desimal, er binær notasjon en repeterende sekvens. Dette betyr at 0,1 aldri kan representeres nøyaktig i binær, uansett hvor mange biter du bruker.