Sto cercando di creare una funzione efficace modf () che usa float invece di double. Un'applicazione incorporata su cui sto lavorando supporta solo il tipo float.
La mia funzione modf () funziona come previsto ad eccezione degli errori di arrotondamento float.
Considera il numero float 12345.67. La versione corrente della mia funzione modf () sottrae semplicemente la parte intera dall'input per ottenere la parte frazione. Quello che mi aspettavo era 12345.67 - 12345. = 0.67, ma non funziona bene.
La mantissa originale per 12345.67 è questa:
100 0000 1110 01.10 1010 1110 < - 0x40E6AE punto decimale = 13
Separato in componenti interi e frazioni è questo:
100 0000 1110 01,00 0000 0000 < - numero intero 0x40E600
000 0000 0000 00,10 1010 1110 < - frazione
La mia funzione modf () normalizza la frazione in:
010 1011 1000 0000 0000 0000 < - 0x2B8000
A causa dell'afflusso di 13 zeri da destra, il numero non è 0,67 come previsto, ma invece, qualcosa come 0.6600178.
Devo correggere l'errore di arrotondamento in modo che sia più vicino a 0.67. La versione binaria di 0.67 è questa:
010 1011 1000 0101 0001 1111 < - 0x2B851F
Si noti che gli ultimi 3 nibble hanno ora i dati. Il primo semestre è lo stesso.
Se cambio il dodicesimo bit da destra a 1, ottengo qualcosa come 0.67002
010 1011 1000 1000 0000 0000 < - 0x2B8800
Questo è abbastanza buono per i miei bisogni, ma se lo facessi quando il float dell'ingresso fosse effettivamente 0.67 per iniziare, avrei il valore sbagliato.
Quindi immagino che la domanda sia: Qual è il modo corretto di applicare pregiudizi a un float in questa situazione?