#include "math.h"
#include "math_private.h"
#include "k_logf.h"
static const float
two25 = 3.3554432000e+07,
ivln10hi = 4.3432617188e-01,
ivln10lo = -3.1689971365e-05,
log10_2hi = 3.0102920532e-01,
log10_2lo = 7.9034151668e-07;
static const float zero = 0.0;
static volatile float vzero = 0.0;
float
log10f(float x)
{
float f,hfsq,hi,lo,r,y;
int32_t i,k,hx;
GET_FLOAT_WORD(hx,x);
k=0;
if (hx < 0x00800000) {
if ((hx&0x7fffffff)==0)
return -two25/vzero;
if (hx<0) return (x-x)/zero;
k -= 25; x *= two25;
GET_FLOAT_WORD(hx,x);
}
if (hx >= 0x7f800000) return x+x;
if (hx == 0x3f800000)
return zero;
k += (hx>>23)-127;
hx &= 0x007fffff;
i = (hx+(0x4afb0d))&0x800000;
SET_FLOAT_WORD(x,hx|(i^0x3f800000));
k += (i>>23);
y = (float)k;
f = x - (float)1.0;
hfsq = (float)0.5*f*f;
r = k_log1pf(f);
if (sizeof(float_t) > sizeof(float))
return (r - hfsq + f) * ((float_t)ivln10lo + ivln10hi) +
y * ((float_t)log10_2lo + log10_2hi);
hi = f - hfsq;
GET_FLOAT_WORD(hx,hi);
SET_FLOAT_WORD(hi,hx&0xfffff000);
lo = (f - hi) - hfsq + r;
return y*log10_2lo + (lo+hi)*ivln10lo + lo*ivln10hi + hi*ivln10hi +
y*log10_2hi;
}