Erreur d'arrondi lors de la conversion double en int16_t
Bonjour,
le programme suivant converti une valeur décimal en binaire après l'application d'un décalage (offset) et d' un facteur d’échelle (scaling).
La division par 0.01 dans la fonction float2int introduit une erreur d'arrondi. Pourquoi?8O
001001001111 est le résultat obtenu (591 en décimal)
001001010000 est le résultat attendu (592 en décimal)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <stdio.h>
#include <iostream>
#include <iomanip>
#include <bitset>
int main(void)
{
int16_t float2int(double value);
double Temp_dec;
int16_t Temp_bin;
Temp_dec = 255.92;
Temp_bin = float2int(Temp_dec);
// Print expected 12 bit binary for decimal value 592
std::cout << "592 (binary): " << std::bitset<12>(592)<< std::endl;
return 0;
}
int16_t float2int(double value)
{
value = (value - 250.00) / 0.01; // offset = 250 and scaling factor = 0.01
std::cout << "Result (dec): " << std::fixed << std::setprecision(2) << value << std::endl;
std::cout << "Result (binary): " << std::bitset<12>(value)<< std::endl;
return (int16_t)(value);
} |
Résultats:
Code:
1 2 3
| Result (dec): 592.00
Result (binary): 001001001111
592 (binary): 001001010000 |