Note: I am coding the following in the Arduino variant of C++.
From a given float (always with four decimal digits), I wish to extract just the decimal part ("mantissa") as an integer.
So I attempted this method:
void ExtractDecimalPart(float Value) {
int IntegerPart = (int)(Value);
int DecimalPart = 10000 * (Value - IntegerPart); //10000 b/c my float values always have exactly 4 decimal places
Serial.println (DecimalPart);
}
But the above results in the following:
ExtractDecimalPart (1234.5677); //prints 5677
ExtractDecimalPart (1234.5678); //prints 5677
ExtractDecimalPart (1234.5679); //prints 5678
Note that the latter two print out wrong; I'm guessing this is due to floating point precision issues.
What is an economical way to solve the above?
This is a cool question.
I will assume that ardiuno is using IEEE 754 when you set a float equal to 1234.5677 the number closest to that that fits in 4 bytes is 1.2345677490234375E3 which looks like 0x449A522B in hex.
but when you put 1234.5678 in to a float the best number it can form is 1.2345677490234375E3 Which is just short. In hex it is 0x449A522B.
So in short floats just can't store number that require number of digites you are using.