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

ilkant

  • Käyttäjä
  • Viestejä: 1716
  • 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: tänään kello 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ä: 1716
  • Kubuntu
    • Profiili
Vs: Python runtime exp overflow
« Vastaus #2 : tänään kello 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ä: 4351
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Python runtime exp overflow [ratkaistu]
« Vastaus #3 : tänään kello 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ä: 16973
    • Profiili
Vs: Python runtime exp overflow [ratkaistu]
« Vastaus #4 : tänään kello 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: tänään kello 11:10 kirjoittanut nm »