Forum >> Programmazione Python >> Calcolo scientifico >> Notazione Scientifica

Pagina: 1

Buon Giorno a tutti

Vorrei sottoporre questo problema di divisione di numeri grandi in quanto python non li gestisce bene.




Il problema è questo..... Dato un numero 342638197292754979757 il quale è divisibile per 37 e che da come risultato 9260491818723107561 su una calcolatrice normale.

In python 3 invece si verifica la seguente condizione... Se io divido il numero in questo modo a=int(n/37) e lo rimoltiplico per 37, il risultato è questo 342638197292754952192.




la funzione (Int) naturalmente serve per verificare che faccia la divisione e la moltiplicazione giusta in quanto (int) arrotonda all'intero, ma essendo gia il risultato un intero

non dovrebbe arrotondare niente e rimoltliplicandolo per lo stesso moltiplicatore riportarlo al valore originale.




Ringrazio chiunque voglia rispondere a questo quesito

Il problema è questo..... Dato un numero 342638197292754979757 il quale è divisibile per 37 e che da come risultato 9260491818723107561 su una calcolatrice normale.

In python 3 invece si verifica la seguente condizione... Se io divido il numero in questo modo a=int(n/37) e lo rimoltiplico per 37, il risultato è questo 342638197292754952192.
L'operatore `/` converte il tuo intero in un float, ed effettua una divisione approssimata secondo le regole dello standard IEEE 754; da cui la perdita di precisione che rilevi.

la funzione (Int) naturalmente serve per verificare che faccia la divisione e la moltiplicazione giusta in quanto (int) arrotonda all'intero, ma essendo gia il risultato un intero

non dovrebbe arrotondare niente e rimoltliplicandolo per lo stesso moltiplicatore riportarlo al valore originale.

In questo caso dovresti utilizzare l'operatore di divisione intera `//`

>>> 342638197292754979757 // 37                                                 
9_260_491_818_723_107_561
>>> _ * 37                                                                      
342_638_197_292_754_979_757
che restituisce il risultato che ti aspetti.


HTH,




THE 🍺-WARE LICENSE (Revision ㊷):
<㎝🐌🐍.🇮🇹> wrote this post. As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you
think this stuff is worth it, you can buy me a 🍺 in return. -- ㎝
Grazie.





Si in questo caso lo gestisce bene
> in quanto python non li gestisce bene

Python, e tutti gli altri linguaggi di programmazione di cui sono a conoscenza.

> In questo caso dovresti utilizzare l'operatore di divisione intera `//`

Beh... no, non proprio. Se l'OP vuole una divisione esatta, ovvero con precisione arbitraria, deve usare il modulo decimal. Poi certo, in questo caso, siccome lui *sa già* che la divisione non dà resto, allora usando l'operatore di divisione intera ottiene il risultato che si aspetta. Ma in generale, non è il modo corretto (e inoltre, se uno sa già il risultato, allora perché chiederlo a Python...).





L'OP dovrebbe probabilmente leggere qualcosa sull'aritmetica in virgola mobile, per esempio anche solo il tutorial di python... adesso anche nella versione tradotta, per comodità assoluta https://pytutorial-it.readthedocs.io/it/python3.8/floatingpoint.html



> in quanto python non li gestisce bene

Python, e tutti gli altri linguaggi di programmazione di cui sono a conoscenza.

> In questo caso dovresti utilizzare l'operatore di divisione intera `//`

Beh... no, non proprio. Se l'OP vuole una divisione esatta, ovvero con precisione arbitraria, deve usare il modulo decimal. Poi certo, in questo caso, siccome lui *sa già* che la divisione non dà resto, allora usando l'operatore di divisione intera ottiene il risultato che si aspetta. Ma in generale, non è il modo corretto (e inoltre, se uno sa già il risultato, allora perché chiederlo a Python...).





L'OP dovrebbe probabilmente leggere qualcosa sull'aritmetica in virgola mobile, per esempio anche solo il tutorial di python... adesso anche nella versione tradotta, per comodità assoluta https://pytutorial-it.readthedocs.io/it/python3.8/floatingpoint.html




Questo naturalmente è solo per verificare l'esattezza dei calcoli.

Io
comunque sono interessato solo ai numeri interi e scarto quelli
decimali. Il problema era vedere in notazione scientifica se il numero
era intero o decimale e l'unico modo era dividerlo per un intero e
rimoltiplicarlo per riavere lo stesso numero iniziale.

Comunque si, con // sembra che il calcolo r=int(n//div), rimoltiplicandolo per lo stesso divisore, si ha una precisione maggiore e solo nel caso di un risultato decimale si avrà la conferma che il numero non può essere diviso per quel divisore.




grazie a tutti




Pagina: 1



Esegui il login per scrivere una risposta.