Hogyan tudom a Python3-ban egy szám köbgyökét kiszámolni?
#1 Erre is van ötleted? :)
math.pow(27, 1/3) == 3
True
math.pow(343, 1/3) == 7
False
A második 6.999999999999999 lesz.
**-al ugyanez a helyzet.
Nem kötekedésből kérdezem, hanem érdekel, hogy hogyan lehet megoldani. :D
Ha tudod, hogy ténylegesen hány tizedesig érdekel akkor használhatod a round(...) függvényt és kerekíted arra ami tényleg "érdekes" az esetek nagy részében 6-7 tizedesnél több nem fog kelleni.
Ezt egyébként kerekítési (más tankönyvekben) számábrázolási hibának nevezik. Ez egy "ismert" jelenség. round(math.pow(343,1/3),6) == 7 már jó lesz és akkor 6 tizedesen belül fogsz számolni.
4: De többek között a gyökvonással is baj van (főleg a hatványozás részével) mert az már ilyen "belátható" tartományban eléggé pontatlan eredményt ad. A python-t még nem néztem, hogy hogyan számol, de a legtöbb helyen a hatványozást azaz az y=a^b -> c=ln(a^b)=c=b*ln(a) azonossággal, majd utána egy y=e^c módszerrel számolják, mind az ln(x) mind az e^x jól sorfejthető, és ha nem elég tagig számolják végig, vagy nem jó közelítést használnak akkor már viszonylag "hamar" pontatlanná válik az eredmény.
Eztől függetlenül igazad van abban amit írtál, hogy lebegőpontos esetben az "=="-vel vigyázni kell, mert nem tudhatjuk, hogy mennyire lesz "pontatlan" az eredmény és nem fog egyenlőséget adni.
Persze, tudom hogy működik a float. :)
Csak az volt a kérdés, hogy hogy lehet kikerülni.
De akkor csak a kerekítéssel..
Köszi a választ!
Lebegőpontos számokat sose vizsgálunk == operátorral. Helyette pl.:
math.abs(math.pow(343, 1/3)-7)<=10**(-10)
"#1 Erre is van ötleted? :)"
Nem #1-es vagyok, én csak most látom a kérdést.
"De akkor csak a kerekítéssel.."
Ez nem igaz, ezek szerint nem ismeritek annyira a python modulokat.
from sympy import Integer,Rational
math.pow(27, 1/3) == 3 helyett -> Integer(27)**Rational(1,3) == 3
math.pow(343, 1/3) == 7 helyett -> Integer(343)**Rational(1,3) == 7
Így biztosan pontos lesz, lehet Integer azaz sympy.core.numbers.Integer típus helyett simán csak a default int-el is azaz 343**Rational(1,3).
bár mondjuk ha pl 26-ot emeled így köbgyök alá akkor már szimbolikus reprezentáns formában pontosabban sympy.core.power.Pow típusú objektumként adja meg. A 343.0**Rational(1,3) meg már megint a float típus helyett pontatlanságot fog okozni, így 343.0**Rational(1,3) == 7 már megint False lesz. Lehet kasztolni is float-ra, ez egy "hack", mint látható, hogy annyira nem pontatlan az a float. Azaz float(343**Rational(1,3)) == 7 True lesz, bár azért jobb vigyázni ezzel a float-al == operátor esetében.
Különböző számok ábrázolására alkalmas típusok vannak pytonba, az operátorok esetében (is) az operandusok típusától is függ a művelet eredménye és számítás módja, pontossága.
Még csak azt se állítom hogy ez az egyetlen megoldás, sőt nem csak ez az egy megoldás. Megoldás lehet még például az mpmath modullal "bűvészkedni". Vagy még megoldás lehet elmélyedni a numerikus közelítő módszerekbe és implementálni egy köbgyökvonást.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!