Skip to content

Instantly share code, notes, and snippets.

@yuriks
Last active September 2, 2015 19:14
Show Gist options
  • Select an option

  • Save yuriks/2a5a5aa4878206e39589 to your computer and use it in GitHub Desktop.

Select an option

Save yuriks/2a5a5aa4878206e39589 to your computer and use it in GitHub Desktop.
PICA f32 -> f31/f24 conversion
u32 f31FromFloat(float f) {
u32 i;
memcpy(&i, &f, 4);
u32 mantissa = (i << 9) >> 9;
s32 exponent = (i << 1) >> 24;
u32 sign = (i << 0) >> 31;
// Re-bias exponent
exponent = exponent - 127 + 63;
if (exponent < 0) {
// Underflow
return sign << 30;
} else if (exponent > 0x7F) {
// Overflow: saturate to infinity
return sign << 30 | 0x7F << 23;
}
return sign << 30 | exponent << 23 | mantissa;
}
u32 f32tof31(float fval) {
u32 tmp1,tmp2;
u32 tmp3;
memcpy(&tmp3, &fval, 4);
tmp1=(tmp3<<9)>>9;
tmp2=tmp3&(~0x80000000);
if(tmp2){
tmp1=(tmp3<<9)>>9;
int tmp=((tmp3<<1)>>24)-0x40;
if(tmp<0)return ((tmp3>>31)<<30);
else tmp2=tmp;
}
tmp3>>=31;
return (tmp1|(tmp2<<23)|(tmp3<<30));
}
u32 f24FromFloat(float f) {
u32 i;
memcpy(&i, &f, 4);
u32 mantissa = (i << 9) >> 9;
s32 exponent = (i << 1) >> 24;
u32 sign = (i << 0) >> 31;
// Truncate mantissa
mantissa >>= 7;
// Re-bias exponent
exponent = exponent - 127 + 63;
if (exponent < 0) {
// Underflow: flush to zero
return sign << 23;
} else if (exponent > 0x7F) {
// Overflow: saturate to infinity
return sign << 23 | 0x7F << 16;
}
return sign << 23 | exponent << 16 | mantissa;
}
u32 f32tof24(float f)
{
//if(!f)return 0;
u32 v;
memcpy(&v, &f, 4);
u8 s=v>>31;
s32 exp=((v>>23)&0xFF)-0x40;
u32 man=(v>>7)&0xFFFF;
if(exp>=0)return man|(exp<<16)|(s<<23);
else return s<<23;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment