Få mest mulig ut av tall med desimaler

En av de mest brukte datatypene i Python er float, som representerer flyttall. Flytende tall er tall, positive eller negative, som har en desimal. Flytpunkttall inkluderer også tall representert ved hjelp av vitenskapelig notasjon, med tegnet e eller E som brukes til å indikere en potens på 10.

Float er en veldig viktig datatype da den kan representere et bredt spekter av reelle tall, fra veldig små tall til veldig store tall.

Eksempler på flyttall i Python er vist nedenfor:

# float numbers
a = 20.0
b = -51.51345
c = 65e7
d = -1.08E12
e = 2E10

print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))

Produksjon:

<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>

I tillegg tillater de mer nøyaktige beregninger sammenlignet med datatyper som heltall, som fjerner brøkdelen av tall. For eksempel, med heltall, vil et tall som 3.142 bare bli representert som 3.

Imidlertid vil flytedatatypen representere det faktiske tallet som det er, som er 3.142. Derfor er flyteverdier bedre egnet for matematiske beregninger da de gir mer nøyaktige resultater.

I den forbindelse er flytende kommaverdier mye brukt i virkelige modellering, maskinlæring, datavitenskap, finansiell og økonomisk analyse, matematiske beregninger, grafikk og visualiseringer, og vitenskapelige og tekniske beregninger.

Heltall vs. Float i Python

Heltall er en annen veldig populær datatype i Python. I motsetning til flytende kommatall, har ikke heltall et desimaltegn. Heltall er bygd opp av positive hele tall, negative tall og null, som alle ikke har en brøkdel.

Heltall er nyttige når vi utfører operasjoner som involverer hele tall, for eksempel ved telling eller indeksering. I Python er heltallsverdier angitt som int.

Noen heltall er vist nedenfor:

a = 0
b = 968
c = -14

print(type(a))
print(type(b))
print(type(c))

Produksjon:

<class 'int'>
<class 'int'>
<class 'int'>

Noen av forskjellene mellom heltall og flyttall i Python inkluderer:

Karakteristisk Heltall(int) Flytende tall(flytende) Representerer Hele tall, deres negative motstykker, og null, alle uten desimal.Reelle tall med et desimalpunktPresisjonUbegrenset presisjon, derfor er det ingen grense for hvor lang eller stor en int-verdi kan være. Den eneste begrensningen vil være tilgjengelig minne i systemet. Har begrenset presisjon. Den største flyteverdien du kan lagre er ca. 1,8 x 10308MinnebrukBruker mindre minne som flyterBruk mer minne enn heltallsverdierBitvise operasjoner Utstrakt brukt i bitvise operasjoner Brukes nesten aldri i bitvise operasjonerBruk Vanligvis brukt i telling, indeksering og bitvise operasjonerOmfattende brukt i målinger og beregninger, de fleste matematiske operasjoner

  11 Deep Learning-programvare i 2022

Ulike måter å lage og bruke flyter i Python

En enkel måte å begynne å jobbe med flyteverdier i Python på er å tilordne en variabel en flyteverdi slik:

# assign a variable a float value
a = 3.142

En annen måte å få flyteverdier på er å konvertere heltall og numeriske strenger til flyteverdier ved å bruke float()-konstruktøren. Hvis vi sender inn et heltall eller en numerisk streng til float(), vil den bli konvertert til en float-verdi som vist nedenfor:

number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# Convert to a float and store the float value in a variable
a = float(number1)
print(a)
b = float(numString1);
print(b)
c = float(numString2)
print(c)

Produksjon:

2524.0
513.523
1341.0

I eksemplet ovenfor blir heltall og strenger konvertert til float-verdi ved hjelp av float() og deretter lagret i en variabel, som deretter skrives ut, og viser den resulterende float-verdien etter konvertering.

En annen måte å få flyteverdier på er ved å utføre matematiske beregninger som divisjon, som vist nedenfor:

num1 = 20
num2 = 3
result = num1/num2
print("Result of the division as an integer:")
print(int(20/3))
print("Result of the division as a float value:")
print(result)
print(type(result))

Produksjon:

Result of the division as an integer:
6
Result of the division as a float value:
6.666666666666667
<class 'float'>

I eksemplet ovenfor, legg merke til at flyteverdien gir oss et mer nøyaktig svar sammenlignet med å dele og få resultatet tilbake som et heltall.

Når du arbeider med flyttall i Python, kan du støte på noen veldig interessante resultater på grunn av hvordan flyteverdier er representert internt i datamaskinen. Flytende tall er representert i maskinvare som basis 2 (binære) brøker.

Imidlertid kan de fleste desimalbrøker, spesielt de med tilbakevendende desimaler, ikke representeres som en eksakt binær brøk. Som et resultat lagres flytende kommatall vanligvis som en tilnærming av den faktiske verdien.

For å se dette praktisk, vurder flyteverdien 0,3. Hvis du tilordner 0.3 til en variabel internt, vil den ikke bli lagret som nøyaktig 0.3. For å se dette kan vi bruke format()-funksjonen for å se hvordan 0.3 er representert internt. format() lar oss vise et ønsket antall signifikante tall av en verdi vi jobber med. I eksemplet nedenfor skriver vi ut 0,3 til 20 signifikante tall for å se hvordan det lagres internt.

num = 0.3
print("num to 20 significant figures")
print(format(num, '.20f'))
print("Value we stored for num")
print(num)

Produksjon:

num to 20 significant figures
0.29999999999999998890
Value we stored for num
0.3

Som du kan se, er verdien 0,3 som vi tilordnet en variabel kalt num, ikke lagret internt som nøyaktig 0,3. Når du skriver ut variabelen num får du en avrundet verdi.

  Trinn-for-trinn-veiledning for dataforskere

På grunn av dette kan du få noen uventede resultater når du arbeider med flyteverdier. For eksempel, hvis du skal gjøre en manuell beregning på 0,3 + 0,3 + 0,3, vil svaret ditt være 0,9. Men ifølge Python er det ikke tilfellet fordi internt lagrer den binære brøktilnærminger av den faktiske verdien. Dette kan sees nedenfor:

sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

Produksjon:

Is sum equal to answer: 
False
The internal representation of of sum is: 
0.8999999999999999
The answer from manual calculation is: 
0.9

Når du arbeider med flyteverdier er det derfor viktig å huske på at Python ikke lagrer eksakte verdier internt. I stedet lagrer den tilnærminger av den faktiske verdien.

Derfor, når du sammenligner mellom flyteverdier, vil du kanskje først runde av til samme antall signifikante tall. For større nøyaktighet når du arbeider med flyttall i Python, bør du vurdere å bruke den innebygde desimalmodulen.

Desimalmodul i Python

I situasjoner der høy nøyaktighet er viktig og et must-have som i økonomiske og vitenskapelige beregninger, er det ikke ideelt å bruke float. For å garantere høy nøyaktighet når du arbeider med flyttall, brukes den innebygde Python-modulens desimal.

I motsetning til float som er lagret som binære flyttallsrepresentasjoner som er maskinavhengige, lagrer desimalmodulen flyttall ved bruk av maskinuavhengig desimalbasert representasjon som gir høyere nøyaktighet.

I tillegg er desimalmodulen i stand til å representere desimaltall nøyaktig slik de er og bruke dem nøyaktig slik de er i beregninger. Den tilbyr også korrekt avrundet desimal flytekomma-aritmetikk.

For å begynne å bruke desimalmodulen, importer den til Python-filen din som følger:

import decimal

For å se fordelen med desimalmodulen, la oss gjøre om den tidligere sammenligningen mellom summen av 0,3 + 0,3 + 0,3 og verdien 0,9. Koden for å gjøre dette er vist nedenfor:

import decimal

sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

Produksjon:

Is sum equal to answer: 
True
The internal representation of sum is: 
0.9
The answer from manual calculation is: 
0.9

Derfor, når du arbeider med flyttall og trenger høy nøyaktighet, husk å alltid bruke desimalmodulen.

  8 Beste Service Mesh Managers for å bygge moderne applikasjoner

Vanlige feil ved arbeid med flyter

Mange av feilene som oppstår når man jobber med Float i Python kommer fra at man ikke forstår hvordan flytepunkttall er representert internt av Python. For eksempel vil en verdi som 0,3 ikke lagres nøyaktig som 0,3. Derfor vil du sannsynligvis støte på feil hvis du arbeider med flyteverdier, forutsatt at de er lagret nøyaktig som de er.

En vanlig feil er avrundingsfeilen du vil støte på når du utfører matematiske beregninger på flyteverdier. Siden Python ikke kan representere de faktiske flyteverdiene, vil du sannsynligvis støte på avrundingsfeil der resultatene kanskje ikke er som du forventer.

På grunn av feil som avrundingsfeil, vil du sannsynligvis støte på feil når du prøver å gjøre likhetssammenligninger mellom flyttallsverdier. Utvis mye forsiktighet når du arbeider med flyter i Python, og vær oppmerksom på uventede utfall.

En bedre måte å unngå alle feilene som kan oppstå når du arbeider med flyteverdier er å bruke den innebygde desimalmodulen. På denne måten vil resultatene fra beregningene med flyttall være mer forutsigbare og nøyaktige.

Konklusjon

Som programmerer som jobber med Python, er du nødt til å bruke flytedatatypen. For å unngå feil med denne datatypen er det viktig å forstå hvordan Python representerer flyttall internt. Siden Python ikke kan lagre de faktiske flytetallene, unngå å gjøre eksakte likhetssammenligninger med flyteverdier. Ellers vil du få feil.

Hvis du trenger nøyaktige resultater i applikasjonen, unngå å bruke flyteverdier. Bruk i stedet den innebygde desimalmodulen, som gir nøyaktige flyttallresultater og representerer dem nøyaktig slik de er og på en maskinuavhengig måte.

Du kan også lese Python Itertools Functions og Python Try Except.