Topic: numeri macchina e operazioni sbagliate  (Letto 86 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Upandown11

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
numeri macchina e operazioni sbagliate
« il: Dicembre 03, 2020, 20:52 »
Ciao a tutti stavo scrivendo un programma che dato un numero ritorna i primi l termini  del suo sviluppo in frazione contina. Eccolo:

def fraz_cont(x,l):
    if(x>0):
        L=[int(x)]
    else:
        L=[int(x)-1]
        x=x-int(x)+1
    while(len(L)<l and x!=int(x)):
        x=1/(round(x-int(x),12)) 
    return L


Il problema è la condizione di arresto del while: il ciclo continua finchè la parte decimale di x è nulla. Purtroppo i numeri del calcolatore sono finiti quindi spesso vengono approssimati col numero macchina più vicino ma questo rende l'output errato. Ho provato a utilizzare round per troncare un po' i numeri ma funziona raramente. Come potrei modificarlo?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:numeri macchina e operazioni sbagliate
« Risposta #1 il: Dicembre 04, 2020, 10:39 »
in generale, se hai bisogno di numeri con precisione arbitraria, non puoi usare i float (e le operazioni possibili sui float, come round, non aiutano di certo, anzi). Il tutorial di python ha un'ottima appendice che spiega i problemi di precisione dell'aritmetica in virgola mobile... e siccome io ho tradotto il tutorial in italiano, non posso non linkare: https://pytutorial-it.readthedocs.io/it/python3.9/floatingpoint.html
Se ti serve una rappresentazione con precisione arbitraria, puoi usare decimal https://docs.python.org/3.9/library/decimal.html#module-decimal