I am trying to read a double-precision floating point number from Flash into RAM. It is correctly stored in flash as:
0x3e3ce7b697e010B6 = 6.7299999999999997139836383094E-9
Since Processor Expert provides methods for reading (at most) Long data types, I am loading 4 bytes at a time using:
double myDbl;
unsigned long temp0, temp1;
IFsh1_TAddress Addr = FLASH_LOC; //this is where the 8-byte double is correctly stored as 0x3e3ce7b6 97e010B6
IFsh1_GetLongFlash(Addr, &temp0); //here temp0 is correctly populated with 0x3E3CE7B6
IFsh1_GetLongFlash(Addr+4, &temp1); //here temp1 is correctly populated with 0x97E010B6
myDbl = ((unsigned long long)(temp0)<<32) | (unsigned long long)(temp1) //adding/ORing produces the same result
But, no matter how i cast or combine these variables in RAM, the last byte of the fractional part of myDbl is truncated. I wind up with:
myDbl = 0x3e3ce7b697e01000 = 4.4847141003722793e+018 (according to the debugger)
I can manually edit the fraction in the debugger, but it won't let me change "00" to "B6". It's almost like it thinks that would be out of range for a double, which it's not. I've tried casting temp0, temp1, and their combination as long, ulong, long long, and unsigned long long. I've tried adding, ORing, and anything else i could think of.
The result is the same even if I hard code it as myDbl = (double)(0x3E3CE7B697E010B6);
This is the FRDM-KL02Z board, and I'm using KDS 2.0.0 with the Cross ARM GNU Assembler and Cross ARM C Compiler and GDB PEMicro (OpenSDA) debugger. Optimizations are set to none and Endianness is Little.
Casting issue? Compiler issue? Can anyone help???
Thank you in advance,
Jonathan