Come posso utilizzare l'aritmetica in virgola fissa per convertire da Celsius a Fahrenheit?

1

Dichiarazione di non responsabilità: mi rendo conto che questo non è il modo più semplice o addirittura migliore per gestirlo e lo chiedo in gran parte per un senso di curiosità, non perché sono convinto che questo sia il modo giusto. È un puzzle divertente con cui ho lottato per un giorno o giù di lì e non riesco a capire (e non riesco a trovare una buona risposta online!)

Sto lavorando a un progetto con il mio Arduino (ma questo potrebbe applicarsi a qualsiasi hardware) che coinvolge la temperatura di rilevamento. Ricevo il valore, lo analizzo e lo memorizzo in Celsius con un fattore di ridimensionamento di 1/100. per esempio. il valore 5.34C è memorizzato come uint16_t 534 . Pertanto, la stampa di questo valore è una questione di print (temp / 100 + "." + temp % 100) . Quando lo uso per la logica nel mio programma ho bisogno solo di confrontarlo con un altro valore con un fattore di scala 1/100 e tutto funziona alla grande.

Facciamo finta che il mio Arduino o qualunque sistema non abbia supporto per i numeri in virgola mobile e ho solo numeri interi. Come posso convertire questo numero in Fahrenheit? Ho provato più volte a lavorare su carta e sembra giusto, ma ottengo sempre un risultato errato durante il test.

    
posta brenzo 19.06.2018 - 23:44
fonte

1 risposta

4

Prima moltiplicare, quindi dividere; che nasconderà l'intero errore di arrotondamento più:

in virgola mobile (più preciso):

534.0 / 5.0 * 9.0 + 32.0 = 41.612

in aritmetica intera

534 / 5 * 9 + 3200 = 4154 (or 41.54 after scaling back)

perché 534/5 = 106 , in aritmetica intero, invece di 106.8 ; questo errore di arrotondamento viene quindi moltiplicato (ingrandito per moltiplicazione), che rappresenta il 41.54 rispetto a 41.61 che vogliamo.

How can I convert this number to Fahrenheit?

Moltiplicando prima, poi dividendo:

534 * 9 / 5 + 3200 = 4161 (or 41.61 after scaling back)

in alternativa, puoi

  • scala più in alto per la conversione, ad es. 1/1000 anziché 1/100

  • arrotondare prima della divisione, ad es. aggiungi 2 (o 3) prima di dividere per 5:

    (534+2) / 5 * 9 = 4163 (or 41.63 after scaling back)
    

Combinare il "moltiplicare per primo" e "il rastrellamento prima di dividere" è ragionevole:

(534 * 9 + 2) / 5 = 4161 (or 41.61 after scaling back)

E infine, combinando tutto quanto sopra (ridimensionamento a 1/1000, usando prima il multiplo e il round prima di dividere):

(534 * 900 + 25) / 50 + 32000 = 41612 (or 41.612)

NOTA: questo non sta sostenendo l'aritmetica in virgola fissa, di per sé, ma piuttosto semplicemente lavorando una formula con il numero in scala. Più vero per l'aritmetica del punto fisso suggerire 534 / 500 * 900 + 3200 = 4100 . (Ciò trarrebbe vantaggio anche da moltiplicare per primo: 534 * 900 / 500 + 3200 = 4161 .)

    
risposta data 20.06.2018 - 01:47
fonte

Leggi altre domande sui tag