Gestire unità in operazioni aritmetiche (moltiplicazione e divisione)

2

Ho bisogno di progettare una funzione per eseguire le operazioni aritmetiche di base che sono addition (+) , subtraction (-) , multiplication (x) e division (/) tra 2 numeri.

Quella funzione richiede 3 argomenti:
- number1 : composto da value e unit .
- number2 : composto di value e unit .
- operation_type : una delle 4 operazioni di cui sopra.

e dovrebbe tornare:
- number3 : composto da value e unit .

Restituire number3 's value è facile poichè tutto ciò che devo fare è usare istruzioni condizionali per eseguire l'operazione corrispondente (ad esempio if (operation_type == 'addition') { number3.value = number1.value + number2.value; } ).

Tuttavia ho difficoltà a capire come dovrei rappresentare e gestire il unit ( per multiplication e subtraction operazioni, come per addition e subtraction rimane uguale ) in modo che sia possibile associare più operazioni e aggiornare correttamente il unit risultante ogni volta. Ecco un esempio:

operations type: multiplications
number1.unit: Kw
number2.unit: h / user / year
number3.unit: Kwh / user / year  _
                                  |
number1.unit: Kwh / user / year  <-
number2.unit: user
number3.unit: Kwh / year  _
                           |
number1.unit: Kwh / year  <-
number2.unit: year
number3.unit: Kwh
...

Il mio unico vincolo è che unit deve essere inizialmente rappresentato come string perché è archiviato nel database, quindi possiamo analizzarlo in object/array come necessario.

Alcuni dei problemi che sto affrontando:
Q1: come garantire un ordine coerente nell'unità risultante (ad esempio h x Kw e Kw x h dovrebbero entrambi dare Kwh )?
Q2: come gestire unità complesse (ad esempio foo / Kw x h / bar )?

E perché la speranza muore per ultimi:
Q3: esistono algoritmi / schemi di progettazione noti per affrontare questo?

    
posta Max 20.08.2012 - 18:10
fonte

2 risposte

4

Se hai solo bisogno di gestire quantità fisiche, puoi scegliere un sistema n-dimensionale di unità fisiche (lunghezza, massa, tempo, carica, ecc.) adatto al tuo dominio. Qualsiasi unità fisica è un prodotto di poteri delle unità fondamentali (positivo e negativo): ad es. forza = massa * lunghezza * tempo ^ -2. Quando moltiplichi le quantità fisiche, puoi semplicemente aggiungere i poteri delle unità fondamentali. Se devi gestire i poteri frazionali, li rappresenterei come rapporti (1/3), non in virgola mobile (0.33333333)

Ordinare la visualizzazione umana è in gran parte una questione di costume. Tipicamente l'ordine è un potere positivo di massa, lunghezza, tempo nel numeratore e nel denominatore, ad es. km-m ^ 2 / s ^ 2. Ma ci sono molte eccezioni. Ad esempio, la costante di Hubble ha il tempo di dimensione ^ -1, ma è tipicamente espressa come velocità / distanza, ad es. km / sec / megaparsec.

Per quanto ne so, C ++ è l'unica lingua popolare con un sistema di tipi abbastanza potente da convenientemente per verificare il bilanciamento dell'unità fisica in fase di compilazione . Sono disponibili diverse librerie C ++, inclusa una in Boost. Se non stai usando C ++, potresti volerne dare uno sguardo per ispirazione.

    
risposta data 20.08.2012 - 18:54
fonte
1

Vorrei solo creare una tabella di ricerca

È il modo più veloce per garantire che quando ottieni kW e h , indipendentemente dall'ordine, torni con kW*h .

L'unico svantaggio è che se hai un numero molto elevato di combinazioni, può essere difficile mettere insieme il tavolo.

    
risposta data 20.08.2012 - 18:54
fonte

Leggi altre domande sui tag