# RE: Oggetto Math

**URL:** <https://www.ruby-forum.com/t/re-oggetto-math/106186>\
**Category:** IT\
**Created:** [June 7, 2007, 9:25am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186 "2007-06-07T09:25:30Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 9:25am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/1 "2007-06-07T09:25:30Z")

</div>

Anzi, a tal proposito, visto che qui ci sono persone che con la  
matematica non se la cavano per nulla male, ed io invece ho FORTI  
difficoltÃ , se qualcuno mi aiutasse a trasformare la formula in codice  
gli sarei moooolto grato…

la formula in questione Ã¨ la prima presente su

> **[Formule Matematiche di Calcolo del Mutuo | Telemutuo.it](https://www.telemutuo.it/formule-calcolo-mutuo/)**
>
> Quali sono le formule matematiche per calcolare un mutuo? Scoprilo in questa guida di telemutuo.it!

ed io l’ho implementata come:

@rata = c \* ((1+ta/pa)**(pa\*a)) \* ( (ta/pa) / ((1+ta/pa)**(pa\*a))-1)  
il che ovviamente Ã¨ sbagliato, ma data la mia scarsissima cultura  
matematica Ã¨ il massimo che posso raggiungere.  
grazie anticipato a chi ci si cimenterÃ .

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 9:34am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/2 "2007-06-07T09:34:35Z")

</div>

Giuliano U. ha scritto:

> @rata = c \* ((1+ta/pa)**(pa\*a)) \* ( (ta/pa) / ((1+ta/pa)**(pa\*a))-1)

Non mi sembra sbagliata, perÃ² quando le formule sono co complicate mi  
piace riscriverle in piÃ¹ step per mantenere chiarezza:

x = ta/pa  
y = (1 + x) \*\* (pa \* a)  
@rata = c \* y \* x / (y -1)

PiÃ¹ leggibile no? 🙂

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 9:47am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/3 "2007-06-07T09:47:37Z")

</div>

On 6/7/07, Giuliano U. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> @rata = c \* ((1+ta/pa)**(pa\*a)) \* ( (ta/pa) / ((1+ta/pa)**(pa\*a))-1)  
> il che ovviamente è sbagliato, ma data la mia scarsissima cultura  
> matematica è il massimo che posso raggiungere.  
> grazie anticipato a chi ci si cimenterà.

Giuliano, scherzavo per la cosa del ‘\*\*’ 🙂

ma percè dici che la tua formula non va bene? sembra corretta rispetto al  
documento che hai linkato.  
hai problemi con le regole di conteggio dei giorni o con il tipo di  
convenzione usata per l’accumulo degli interessi?  
un qualche float che ti scappa da qualche parte forse?

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 10:34am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/4 "2007-06-07T10:34:44Z")

</div>

On 6/7/07, Matteo V. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On 6/7/07, chiaro scuro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> Io ti consiglio soltanto di scrivere dei test; prendi dei casi di cui  
> conosci il risultato, di solito sono i casi limite, e verifica che la tua  
> formula restituisca il risultato corretto con un test _automatico_

e aggiungo… dato che hai la formula excel… generati con excel un  
megatabellone con dati di input e output per molti casi e usalo per  
generare  
un file cvs che guida i tuoi test.

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 10:26am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/5 "2007-06-07T10:26:43Z")

</div>

On 6/7/07, chiaro scuro [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On 6/7/07, Giuliano U. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > @rata = c \* ((1+ta/pa)**(pa\*a)) \* ( (ta/pa) / ((1+ta/pa)**(pa\*a))-1)  
> > il che ovviamente è sbagliato, ma data la mia scarsissima cultura  
> > matematica è il massimo che posso raggiungere.  
> > grazie anticipato a chi ci si cimenterà.

Io ti consiglio soltanto di scrivere dei test; prendi dei casi di cui  
conosci il risultato, di solito sono i casi limite, e verifica che la  
tua  
formula restituisca il risultato corretto con un test _automatico_

M

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 11:11am UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/6 "2007-06-07T11:11:48Z")

</div>

chiaro scuro wrote:

> e aggiungo… dato che hai la formula excel… generati con excel un  
> megatabellone con dati di input e output per molti casi e usalo per  
> generare  
> un file cvs che guida i tuoi test.  
> Io aggiungerei il cosiglio di evitare i float per i calcoli decimali che  
> devono essere precisi poiche i float sono una approssimazione _binaria_  
> dei numeri _reali_ e possono capitare cose “spiacevoli” tipo:

irb(main):002:0\> a = 1.20 - 1.00  
=\> 0.2  
irb(main):003:0\> b = 0.20  
=\> 0.2  
irb(main):004:0\> a==b  
=\> false

(vedi anche questo thread: [Using Float For Currency - Ruby - Ruby-Forum](http://www.ruby-forum.com/topic/48754#10943) )

ciao,  
Luca

–

## Web: [http://spazidigitali.com](http://spazidigitali.com) - [http://thetyper.com](http://thetyper.com) Email mailto://removed\_email\_address@domain.invalid Skype callto://l.mearelli

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 7, 2007, 12:10pm UTC](https://www.ruby-forum.com/t/re-oggetto-math/106186/7 "2007-06-07T12:10:55Z")

</div>

On 6/7/07, Luca M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> irb(main):004:0\> a==b  
> =\> false
> 
> (vedi anche questo thread: [Using Float For Currency - Ruby - Ruby-Forum](http://www.ruby-forum.com/topic/48754#10943) )

Heh. Non è un discorso semplice… che vuol dire “preciso”? Supponiamo  
che  
evitiamo di usare Float, e rappresentiamo i soldi come un numero intero  
di  
centesimi. Allora 100 euro sono rapprestentati dall’intero 10000. Ma  
cosa  
succede se devo dividere 100 euro in 3 pagamenti? Dove finisce il  
centesimo  
che balla? (Vedi il pattern Money di  
Fowler[http://www.martinfowler.com/eaaCatalog/money.html](http://www.martinfowler.com/eaaCatalog/money.html)  
)

In molti casi Float è un’approssimazione accettabile; tieni però conto che  
non si devono mai confrontare due Float con ==. L’uguaglianza fra  
numeri in  
virgola mobile si fa sempre “a meno di un epsilon”, quindi invece di

a == b

devi testare

abs(a - b) \< epsilon

dove epsilon è un numero che in teoria dipende dalla precisione della tua  
macchina, ma che puoi, se (come me) ignori la teoria, sostituire con un  
numero molto piccolo tipo 1e-8 (dipende anche dalla tua applicazione).

M
