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;