Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Hi
I've been thinking of other ways to print floats and I've found a simpler and faster way! ;D
If you use my method please give me Credit!I'll be happy and grateful (Andrew I. Kabakwu is my name )
Algorithm To Print IEEE FLOATS of any size
1. Declare
a string -> number_str
unsigned intergers -> number,count,denominator,exponent
a boolean -> leading_zero
Initialize number_str=" ",all integers to 0 and leading_zero=TRUE;
2. Get the unbiased exponent from IEEE float into exponent eg 0.25 has biased exponent of 125.
So assign exponent = ABSOLUTE(125 - 127) = 2 which is unbiased
3. Make denominator = 2^exponent (2 to the power of exponent).For our example of
0.25,denominator=2^2=4
4. Get mantissa from IEEE format and add Implied 1. assign this to number i.e
number = mantissa OR IMPILED_ONE (set the 24th bit to 1. IMPLIED_ONE = 0x0080 0000 in single precision)
5. Check number > denominator.
a. if false and leading_zero equal TRUE
append '0' and '.' to number_str
set leading_zero = FALSE
b. multiply number by 10 i.e. number = number * 10
ELSE
c. if true
if leading_zero=TRUE
set leading_zero = FALSE
i. subtract denominator from number
ii. add 1 to count
repeat i. and ii. until number < denominator
d. convert count to a string and append to number_str
e. set count = 0
6. if number > 0 go to step 5
7. print number_str ! ;D
Thats IT! It has no shifts or divisions and only 1 multiplication. Comments are welcomed.
Thanks
Can't concentrate on the algorithm right now, but the numero uno thing I'm thinking about now is infinities, positive and negative zeroes, negative numbers, denormal numbers and NaN's. Did you do anything about them?
Candy,
the algorithm is to call after you have done the necessary processing to detect infinities, positive and negative zeroes, negative numbers, denormal numbers and NaN's.
To handle infinities, positive and negative zeroes, negative numbers, denormal numbers and NaN's the best is to perform the TESTS adviced by the IEEE format spec.
I'm working on them
IMPORTANT INFO
there are VERY SERIOUS FLAWS in my initial algorithm post :-[. I coded it and discovered that I was making VERY BAD assumptions which I can only explain with an example.
for example, I was thinking that the float 70.457 looks like
1000110.01110100111111100 (70.457) in memory which is not 100% true because the CPU has no notion of a decimal or binary point so 70.457 is 0x8CE9FC.If you use my first algorithm it will print 9234940 and not 70.457 :-[
I've fixed the problems and will post a new algorithm below so that they can be compared.I am still going to perform further debugging tests.