Domanda

Sto lavorando in C per implementare lo pseudo-codice che dice:

delay = ROUND(64*(floatDelay - intDelay))
where intDelay = (int) floatDelay

Il floatDelay sarà sempre positivo. C'è un vantaggio nell'usare la funzione rotonda di math.h:

#inlcude <math.h>
delay=(int) round(64*(floatDelay-intDelay));

oppure posso usare:

delay=(int)(64*(floatDelay - intDelay) + 0.5))
È stato utile?

Soluzione

Dovresti sempre usare le librerie matematiche appropriate quando hai a che fare con numeri in virgola mobile. Un galleggiante può essere solo un'approssimazione molto vicina del valore reale e ciò può causare stranezze.

Ad esempio, 5f potrebbe essere approssimato a 4.9999999 ... e se provi a trasmettere direttamente a int verrà troncato a 4.

Per capire perché in profondità, dovresti cercare i numeri in virgola mobile su Wikipedia. Ma in breve invece di memorizzare il numero come una serie dritta di bit come un int, è memorizzato in due parti. C'è una "frazione" e un esponente, dove il valore finale del float è la frazione * (base ^ esponente).

Altri suggerimenti

Non ci sono vantaggi che io conosca, a parte il fatto che il cast di int potrebbe non essere immediatamente ovvio per gli altri programmatori che funziona come un trunc ...

Considerando che con la funzione rotonda, le tue intenzioni sono chiare.

O va bene, a condizione che tu dica floatDelay sia positivo.

È possibile che uno sia leggermente più veloce dell'altro, anche se sarebbe difficile dire quale senza benchmarking, dato che round () è molto probabilmente implementato come un compilatore intrinseco. È ancora più probabile che qualsiasi differenza di velocità sia estremamente importante, quindi usa quello che ritieni più chiaro.

Ho trovato " Tronca un valore decimale in c ++ " ha fornito un'utile discussione sui numeri in virgola mobile.

In particolare Greg Hewgill ha fornito questo link: Che cosa dovrebbero sapere tutti gli informatici Aritmetica a virgola mobile di David Goldberg

  

Ad esempio, 5f potrebbe essere approssimato a 4.9999999 ...   e se provi a trasmettere direttamente a int verrà troncato a 4.

È davvero vero?

Se ti assicuri di aggiungere lo 0,5 prima di troncare a int,
è davvero un problema 4.9999.

Voglio dire: 4.9999 + 0,5 = 5.4999 - > 5

/ Johan

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top