Kezdőoldal » Számítástechnika » Programozás » Hogyan tudom a Python3-ban...

Hogyan tudom a Python3-ban egy szám köbgyökét kiszámolni?

Figyelt kérdés

2021. okt. 17. 18:05
 1/9 anonim ***** válasza:
96%
1/3-ik hatványra emeled a számot.
2021. okt. 17. 18:16
Hasznos számodra ez a válasz?
 2/9 Pelenkásfiú ***** válasza:

#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

2021. okt. 17. 18:31
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:

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.

2021. okt. 17. 18:37
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
100%

"math.pow(343, 1/3) == 7"

Nem a gyökvonással van a baj, hanem a lebegőpontos értékek egyenlőségének vizsgálatával. Ez ugyanis kerülendő, vagy ha nagyon muszáj, akkor trükkösen kell, pl. ahogy #3 is írta.


[link]

[link]

[link]

stb..

2021. okt. 17. 20:15
Hasznos számodra ez a válasz?
 5/9 anonim ***** válasza:
51%

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.

2021. okt. 17. 20:23
Hasznos számodra ez a válasz?
 6/9 Pelenkásfiú ***** válasza:
75%

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!

2021. okt. 17. 20:26
Hasznos számodra ez a válasz?
 7/9 anonim ***** válasza:
100%

Lebegőpontos számokat sose vizsgálunk == operátorral. Helyette pl.:

math.abs(math.pow(343, 1/3)-7)<=10**(-10)

2021. okt. 17. 20:36
Hasznos számodra ez a válasz?
 8/9 anonim ***** válasza:

"#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.

2021. okt. 18. 23:33
Hasznos számodra ez a válasz?
 9/9 zozo256 ***** válasza:
float-ok összehasonlítására a math.isclose a legelegánsabb talán
2021. okt. 20. 10:21
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!