[PIPython] Approssimazione

Ernesto e.picardi
Lun 7 Feb 2005 11:00:50 CET


Ciao,
non so se ho capito bene il problema, ma se vuoi approssimare un numero 
all'intero più prossimo puoi importare il modulo fpformat presente nella 
distribuzione standerd di python.
Esempio:

>>> import fpformat
>>> num=3.555555
>>> fpformat.fix(num,2)
'3.56'
>>> fpformat.fix(num,4)
'3.5556'
>>> fpformat.sci(num,2)
'3.56e+000'
>>> fpformat.sci(num,4)
'3.5556e+000'

Con la funzione fix puoi scegliere il numero di cifre dopo la virgola, 
mentre con sci ottieni lo stesso risultato in notazione scientifica.

Spero ti sia d'aiuto

Ernesto



----- Original Message ----- 
From: "Luigi Pantano" <luigi.pantano a katamail.com>
To: "Gli utilizzatori italiani di Python" <python a lists.python.it>
Sent: Friday, February 04, 2005 8:39 PM
Subject: [PIPython] Approssimazione


Ho creato per un mio amico geometra questo semplice programmino che
effettua dei banali calcoli sui triangoli.
Gli unici problemi che ho riscontrato nella creazione del programma è
stata l'approssimazione ad una determinata cifra dopo la virgola e l'uso
da parte della funzione seno di angoli espressi in centesimi
(solitamente usata dai geometri) e non in radianti!

Per tale ragione ho implementato una rudimentale funzione "approssima"
che svolge egregiamente il suo compito e due funzioni di conversione
"Radianti_Gradi_Centesimi", "Centesimi_Gradi_Radianti".

Spero che tale codice possa essere di aiuto.

P.S.
ogni consiglio sarà ben accetto.



--------------------------------------------------------------------------------


># Teorema
> from math import *
> from string import *
> from os import system
>
> c_centesimi = 1.11111111111
> ordine_di_grandezza = 0.00001
>
> def licenza():
>    '''Mostra i termini della licenza'''
>    print '''Teorema v1.1.20050403
> Copyright (C) 2004 Luigi Pantano
>
> This program is free software; you can redistribute it and/or modify
> it under the terms of the GNU General Public License as published by
> the Free Software Foundation; either version 2 of the License, or
> (at your option) any later version.
>
> This program is distributed in the hope that it will be useful,
> but WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> GNU General Public License for more details.
>
> You should have received a copy of the GNU General Public License
> along with this program; if not, write to the Free Software
> Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> \n'''
>
> def approssima(num):
>    valore_intero = int(num)
>    valori_dopo_la_virgola = str(num).split(".")[1][0:6] #prende gli ultimi 
> 6 valori della parte decimale
>
>    if int(valori_dopo_la_virgola[-1]) > 5:
>        valori_dopo_la_virgola = str(float('0.' + valori_dopo_la_virgola) + 
> float(ordine_di_grandezza))[:-1]
>        return valore_intero + float(valori_dopo_la_virgola)
>    else:
>        return valore_intero + float('0.' + valori_dopo_la_virgola[:-1])
>
> def Centesimi_Gradi_Radianti(valore) :
>    if valore == 0 or valore == 200 or valore == 400 or valore == 600 or 
> valore == 800:
>        print "\t\t** Angolo immesso di dimensioni errate!\n\t\t** 
> Dimensione consentita diversa da k200 centesimali\n\t\t** Ripetere 
> l\'immissione del dato..."
>        return "errato"
>    else :
>        return radians(valore / c_centesimi)
>
> def Radianti_Gradi_Centesimi(valore) :
>    valore = (degrees(valore) * c_centesimi)
>    if valore >= 200 :
>            print "\t\t** Hai ottenuto un angolo PIATTO!\n\t\t** In un 
> triangolo qualsiasi un tale risultato non e\' corretto\n\t\t** Controlla i 
> dati immessi siano corretti."
>    if valore == 0 :
>            print "\t\t** Hai ottenuto un angolo NULLO!\n\t\t** In un 
> triangolo qualsiasi un tale risultato non e\' corretto\n\t\t** Controlla i 
> dati immessi siano corretti."
>    return valore
>
> class Teorema(object) :
>
>    def __init__(self):
>        self.menu=['Teorema di Carnot',
>                    'Teorema dei Seni (lato incognito)',
>                    'Teorema dei Seni (angolo incognito)',
>                    'Esci'
>                    ]
>
>        self.implementors=[self.TeoremaDiCarnot,
>                            self.TeoremaDeiSeni1,
>                            self.TeoremaDeiSeni2,
>                            self.stop
>                            ]
>        self.numbers={}
>
>        self.running=True
>
>    def run(self):
>        while self.running:
>            s=self.menuSelection('Scegli un numero compreso tra')-1
>            self.implementors[s]()
>
>    def stop(self):
>        print "\n*** PROGRAMMA TERMINATO ***\n*** Vi auguro una Buona 
> Giornata ***"
>        self.running=False
>
>    def printMenu(self):
>    system("cls")
>        licenza()
>        for idx,value in enumerate (self.menu):
>            print idx+1,'-',value
>
>    def menuSelection(self,message='Select'):
>        self.printMenu()
>        m=len(self.menu)
>        selection=m+1
>        while selection >m:
>              selection=input (message+' (1-%i):' % m)
>        return selection
>
>    def TeoremaDiCarnot(self):
>        risposta = True
>
>        while (risposta == True) :
>            print "\nApplicazione del Teorema di Carnot\n".upper()
>
>            B = input("\tlato triangolo  (B) : ")
>            C = input("\tlato triangolo  (C) : ")
>
>            a = "errato"
>            while a == "errato":
>                a = Centesimi_Gradi_Radianti(input("\tangolo compreso (a) : 
> "))
>
>            print "\n\tLa misura del lato incognito e\' %f" % sqrt(pow(B,2) 
> + pow(C,2) -2*B*C*cos(a))
>
>            if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : 
> ")) == 's' : risposta = True
>            else: risposta = False
>
>    def TeoremaDeiSeni1(self) :
>        risposta = True
>
>        while (risposta == True) :
>            print "\nApplicazione del Teorema di Seni\n".upper()
>            print "Calcolo del lato incognito\n".upper()
>
>            A = input("\tImmetti la misura del lato noto: ")
>
>            a = "errato"
>            while a == "errato":
>                a =  Centesimi_Gradi_Radianti(input("\tImmetti la misura 
> dell\'angolo opposto al lato noto: "))
>
>            b = "errato"
>            while b == "errato":
>                b =  Centesimi_Gradi_Radianti(input("\tImmetti la misura 
> dell\'angolo opposto al lato incognito: "))
>
>            B = A * sin(b) / sin(a)
>            print "\n\t\tLa misura del lato incognito e\' %f" % 
> approssima(abs(B))
>
>            if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : 
> ")) == 's' : risposta = True
>            else: risposta = False
>
>    def TeoremaDeiSeni2(self) :
>        risposta = True
>
>        while (risposta == True) :
>            print "\nApplicazione del Teorema di Seni\n".upper()
>            print "Calcolo dell\'angolo incognito\n".upper()
>
>            a = "errato"
>            while a == "errato":
>                a = Centesimi_Gradi_Radianti(input("\tImmettere angolo 
> noto: "))
>
>            l1 = input("\tImmettere lunghezza del lato oppsosto all'angolo 
> noto: ")
>            l2 = input("\tImmettere lunghezza del secondo lato: ")
>            try :
>                risultato = Radianti_Gradi_Centesimi(asin(sin(a) * l1/l2))
>                print "\n\tLa misura dell'angolo e\' di %f gradi 
> centesimali" % approssima(risultato)
>            except :
>                print "\n\t\t** Non \'e stato possibile effettuare il 
> calcolo!\n\t\t** I dati immessi non appartengono ad un triangolo!"
>
>            if lower(raw_input("\n\tVuoi ripetere un altro calcolo? (s/n) : 
> ")) == 's' : risposta = True
>            else: risposta = False
>
> if __name__ == '__main__':
>    a=Teorema()
>    a.run()
>


--------------------------------------------------------------------------------


No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.300 / Virus Database: 265.8.5 - Release Date: 03/02/2005



--------------------------------------------------------------------------------


_______________________________________________
La mailing list di python.it
python a lists.python.it
http://lists.python.it/cgi-bin/mailman/listinfo/python



More information about the Python mailing list