Как-то так можно:
Код
float DoubleToFloat(const unsigned char *doublePtr)
{
unsigned long long v = *(unsigned long long*)doublePtr;
unsigned mantissa = (unsigned)((v & 0x003fffffffffffffull) >> (52 - 23));
unsigned exponent = (unsigned)((v & 0x7ff0000000000000ull) >> 52);
if(exponent > 1023 + 127)
mantissa = 0x7fffffff;
if(exponent < 1023 - 127)
return 0.0;
exponent -= 1023 - 127;
exponent <<= 23;
mantissa |= exponent;
if(v & 0x8000000000000000ull)
mantissa |= 0x80000000ul;
union IntToFloat
{
unsigned i;
float f;
}iToF;
iToF.i = mantissa;
return iToF.f;
}
Только поаккуратней с этим кодом - я его быстро набрасал, толком не тестировал.