1*c9945492SAndroid Build Coastguard Worker #include <math.h> 2*c9945492SAndroid Build Coastguard Worker #include <stdint.h> 3*c9945492SAndroid Build Coastguard Worker scalbnf(float x,int n)4*c9945492SAndroid Build Coastguard Workerfloat scalbnf(float x, int n) 5*c9945492SAndroid Build Coastguard Worker { 6*c9945492SAndroid Build Coastguard Worker union {float f; uint32_t i;} u; 7*c9945492SAndroid Build Coastguard Worker float_t y = x; 8*c9945492SAndroid Build Coastguard Worker 9*c9945492SAndroid Build Coastguard Worker if (n > 127) { 10*c9945492SAndroid Build Coastguard Worker y *= 0x1p127f; 11*c9945492SAndroid Build Coastguard Worker n -= 127; 12*c9945492SAndroid Build Coastguard Worker if (n > 127) { 13*c9945492SAndroid Build Coastguard Worker y *= 0x1p127f; 14*c9945492SAndroid Build Coastguard Worker n -= 127; 15*c9945492SAndroid Build Coastguard Worker if (n > 127) 16*c9945492SAndroid Build Coastguard Worker n = 127; 17*c9945492SAndroid Build Coastguard Worker } 18*c9945492SAndroid Build Coastguard Worker } else if (n < -126) { 19*c9945492SAndroid Build Coastguard Worker y *= 0x1p-126f * 0x1p24f; 20*c9945492SAndroid Build Coastguard Worker n += 126 - 24; 21*c9945492SAndroid Build Coastguard Worker if (n < -126) { 22*c9945492SAndroid Build Coastguard Worker y *= 0x1p-126f * 0x1p24f; 23*c9945492SAndroid Build Coastguard Worker n += 126 - 24; 24*c9945492SAndroid Build Coastguard Worker if (n < -126) 25*c9945492SAndroid Build Coastguard Worker n = -126; 26*c9945492SAndroid Build Coastguard Worker } 27*c9945492SAndroid Build Coastguard Worker } 28*c9945492SAndroid Build Coastguard Worker u.i = (uint32_t)(0x7f+n)<<23; 29*c9945492SAndroid Build Coastguard Worker x = y * u.f; 30*c9945492SAndroid Build Coastguard Worker return x; 31*c9945492SAndroid Build Coastguard Worker } 32