Miért van az, hogy Pythonban while ciklust nem lehet, csak egész számmal használni?
Írtam egy ilyen programot:
x=0
while x != 0.1:
x+=0.001
print(x)
Túlmegy a 0.1en,mivel néha többet,vagy kevesebbet ad hozzá,mint 0,001.
Van erre konkrét magyarázat? :O
#2
Miért lenne jó ha egész szám lenne, nem pedig egy bool, string, vagy akármi más? Hagyjuk már ezeket a hülye kérdéseket, valamit addig akar csinálni amíg nem ér el egy adott értéket, ebben az esetben az az érték egy lebegőpontos szám, azért.
A pontos magyarázat az, hogy a számítógép kettes számrendszerben gondolkozik, és kettes számrendszerben más törtszámok reprezentálhatóak pontosan, mint tízes számrendszerben. Mondok egy példát:
Az a szám, hogy 1/3, tizedestört alakban 0.3333...
A pontos reprezentáció lehetetlen, mert végtelen sok hármast kell odaírni. Ha pedig véges sok hármasnál megállsz bárhol, az csak egy közelítés lesz, nem adja vissza az 1/3 pontos értékét. De hármas számrendszerben ez a szám pontosan reprezentálható tizedestört alakban is: 0.1
Itt a fordított az eset: 0.1 tízes számrendszerben jól reprezentálható, kettes számrendszerben viszont egy végtelen tizedestört lesz, aminek a python (meg más nyelvek is) levágják a végét. Szóval a valódi szám, amivel dolgozol, egy közelítés lesz, ami a kerekítési hiba miatt egyre jobban el fog térni a várt eredménytől, ahogy műveleteket végzel vele. Próbáld csak megírni úgy a while ciklust, 0.1 helyett beírsz mondjuk 0.5-öt (1/2 => kettő hatvány a nevezőben!), és az x változót növelgeted mondjuk 0.03125-tel (1/32). Láss csodát, működni fog.
Látom 3–as pythont használsz, akkor a 3.5-től létezik a math.isclose() függvény.
import math
x=0.0
while !math.isclose(x, 0.1):
de ebben az esetben jobb lenne a
while x<0.1:
A magyarázatot már leírta az első és a negyedik válaszadó.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!