We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hello, I have a problem with the accuracy of the result when I divide 2 float values. This is the line in my source Code:
dds_word.long_dds = 2.147483648E16 / 7.1312E7
That looks like you actually need arbitrary precision arithmetics A rough outline: recall how you learned to do multiplication and division on multi-digit numbers in elementary school. Apply same principles to very large numbers, using bytes or ints instead of decimal digits. Let's say we use unsigned 16-bit ints for "digits". That makes your dividend a 4-digit number, and all your divisors 2-digit numbers. So you would divide pairwise, compute remainders and accumulate results. There are multiple precision arithmetics packages out there that help with this --- I'm not aware of any working on 8051s though.
You will find a set of 64-bit functions using only 32-bit variables here: ftp.embedded.com/.../crenshaw98.txt
I have solved the problem. Here is the solution which I use. I hope I will get no problem with the timing.
unsigned long test_value; unsigned int result; unsigned long test_freq; dds_word.long_dds = 0; test_value = 0x04C4B400; for (i=0; i<7; i++) { result = test_value / test_freq; test_value = test_value - (result * test_freq); test_value = test_value << 4; dds_word.long_dds += result; dds_word.long_dds = dds_word.long_dds << 4; } result = test_value / test_freq; dds_word.long_dds += result;