Kirjoittaja Aihe: Python runtime exp overflow [ratkaistu]  (Luettu 444 kertaa)

ilkant

  • Käyttäjä
  • Viestejä: 1725
  • Kubuntu
    • Profiili
Python runtime exp overflow [ratkaistu]
« : 10.02.26 - klo:21.06 »
Python-ohjelmalle tulee virheilmoitus Python 3.13:llä:

RuntimeWarning: overflow encountered in exp
  np.exp( ((clcoding-0.3)*80)**2)*1.5 +

Koneessa on 32 GB ram-muistia. Paljonko sitä pitäisi olla tuohon laskuun?
« Viimeksi muokattu: 12.02.26 - klo:01.04 kirjoittanut ilkant »

retu

  • Käyttäjä
  • Viestejä: 950
    • Profiili
Vs: Python runtime exp overflow
« Vastaus #1 : 11.02.26 - klo:13.26 »
Tuo ilmoitus tarkoittaa että lukualue on ylittynyt. Perus float on kai 64-bittinen eli maximissaan 1.7976931348623157e+308. Jos siis lausekkeen lopputulos on suurempi, tulee tuo virhe. Jos tuo np on numpy, voit käyttää myös float128 tyyppiä, jonka lukualue on suurempi.

Toisaalta, mihin tarviit noin isoja lukuja? Olisiko kenties laskukaavassa joku käpy?

ilkant

  • Käyttäjä
  • Viestejä: 1725
  • Kubuntu
    • Profiili
Vs: Python runtime exp overflow
« Vastaus #2 : 12.02.26 - klo:01.04 »
Toisaalta, mihin tarviit noin isoja lukuja? Olisiko kenties laskukaavassa joku käpy?

Ohje auttoi! Nyt se pystyy laskemaan tämän ohjelman laskut. Tämä on sydänkäyräsimulaattori ja se on kopioitu FaceBookin jostain python-ryhmästä.

Koodia: [Valitse]
import numpy as np
from numpy import float128
import matplotlib.pyplot as plt

if __name__ == '__main__':
    clcoding = np.linspace(0, 1, 500)
    ecg = float128(10000)
    ecg = (
        np.sin(2*np.pi*5*clcoding)*0.1 +
        np.exp( ((clcoding-0.3)*80)**2)*1.5 +
        np.exp( ((clcoding-0.32)*200)**2) *-2 +
        np.exp( ((clcoding-0.35)*60)**2)*0.8
    )

    plt.figure(figsize=(8,3))
    plt.plot(clcoding,ecg)
    plt.title("Simulated Heartbeat Signal (ECG)")
    plt.xlabel("Time")
    plt.ylabel("Voltage")
    plt.grid()
    plt.show()

SuperOscar

  • Käyttäjä
  • Viestejä: 4354
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Python runtime exp overflow [ratkaistu]
« Vastaus #3 : 12.02.26 - klo:10.55 »
Eksponenttifunktio ylivuotaa nopeasti float64:llä. 700:lla tulee vielä vastaus (1.0142320547350045e+304), 800 ylivuotaa, noin pikakokeena.

Numpyssä on muuten neliöimiseen funktio square(); en sitten tiedä, onko se merkitsevästi nopeampi kuin kahteen korottaminen (** 2) – tai onko nopeus kannaltasi mitenkään oleellinen tekijä.
pöytäkone 1, kannettavat 1–3, NUC: Debian GNU/Linux 13;  pöytäkone 2: NixOS 25.11; RPi 1: FreeBSD 14.3-RELEASE; RPi 2: Raspberry Pi OS 13

nm

  • Käyttäjä
  • Viestejä: 16978
    • Profiili
Vs: Python runtime exp overflow [ratkaistu]
« Vastaus #4 : 12.02.26 - klo:11.07 »
Toisaalta, mihin tarviit noin isoja lukuja? Olisiko kenties laskukaavassa joku käpy?

Ohje auttoi! Nyt se pystyy laskemaan tämän ohjelman laskut. Tämä on sydänkäyräsimulaattori ja se on kopioitu FaceBookin jostain python-ryhmästä.

Koodistasi puuttuu miinusmerkit np.exp-funktion sisältä. Siksi lasku vuotaa yli 64-bittisistä liukuluvuista, eikä piirretty käyrä näytä samalta kuin Facebook-esimerkissä.

Kokeile tällä korjatulla versiolla:
Koodia: [Valitse]
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
    clcoding = np.linspace(0, 1, 500)
    ecg = (
        np.sin(2*np.pi*5*clcoding)*0.1 +
        np.exp(-((clcoding-0.3)*80)**2)*1.5 +
        np.exp(-((clcoding-0.32)*200)**2)*(-2) +
        np.exp(-((clcoding-0.35)*60)**2)*0.8
    )

    plt.figure(figsize=(8,3))
    plt.plot(clcoding,ecg)
    plt.title("Simulated Heartbeat Signal (ECG)")
    plt.xlabel("Time")
    plt.ylabel("Voltage")
    plt.grid()
    plt.show()
« Viimeksi muokattu: 12.02.26 - klo:11.10 kirjoittanut nm »

ilkant

  • Käyttäjä
  • Viestejä: 1725
  • Kubuntu
    • Profiili
Vs: Python runtime exp overflow [ratkaistu]
« Vastaus #5 : 13.02.26 - klo:09.29 »
Olen kokeillut jonkin verran noita koodipätkiä. Ne ovat yleensä kuvana. Miksei linkkinä kooditiedostoon, joka olisi tekstinä? Tai jokin kopiointipainike, jolla koodin saisi kopioitua leikepöydälle. Näin on tekoälysivuilla ja myös useammassa Q&A sivustoilla, joissa on neuvoja erilaisten vikatilanteiden välttämiseksi.

Tavallisesti kun olen jonkun koodin kirjoittanut kuvasta tekstiksi, tulee 2 tai 3 korjauskierrosta, joissa jouduu korjaamaan virheellisesti kirjoittamaansa koodia. Joskus joku rivi jää välistä pois ja joskus joku merkki on tullut nätyä ihan erilaisena kuin se oikeasti on. Tarkoitus on käydä jossain vaiheessa optikolla silmälasien uusimisen merkeissä. Mukavaa on myös Python Quiz koodipätkien kirjoittaminen tekstiksi ja käytännössä nähdä, mitä ne tulostavat. Ja voi sitä esimerkkiä muunnella ja kokeilla, miten tulostus muuttuu kun jotain muuttaa. Sekä voi palastella koodin ja katsoa yksityiskohtaisesti, mitä välituloksia mikäkin operaatio antaa.
« Viimeksi muokattu: 13.02.26 - klo:09.32 kirjoittanut ilkant »