Last active
September 2, 2015 19:14
-
-
Save yuriks/2a5a5aa4878206e39589 to your computer and use it in GitHub Desktop.
PICA f32 -> f31/f24 conversion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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