Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › compiler_rt/ › log2.zig › log2f
log2f
log2.log2f
pub fn log2f (x_ : f32 ) callconv (.c ) f32
File
Code
pub fn log2f (x_ : f32 ) callconv (.c ) f32 {
const ivln2hi : f32 = 1.4428710938e+00 ;
const ivln2lo : f32 = -1.7605285393e-04 ;
const Lg1 : f32 = 0xaaaaaa.0p-24 ;
const Lg2 : f32 = 0xccce13.0p-25 ;
const Lg3 : f32 = 0x91e9ee.0p-25 ;
const Lg4 : f32 = 0xf89e26.0p-26 ;
var x = x_ ;
var u : u32 = @bitCast (x );
var ix = u ;
var k : i32 = 0 ;
if (ix < 0x00800000 or ix >> 31 != 0 ) {
if (ix << 1 == 0 ) {
return if (compiler_rt .want_float_exceptions ) -1 / (x * x ) else -std .math .inf (f64 );
}
if (ix >> 31 != 0 ) {
return if (compiler_rt .want_float_exceptions ) (x - x ) / 0.0 else math .nan (f64 );
}
k -= 25 ;
x *= 0x1.0p25 ;
ix = @bitCast (x );
} else if (ix >= 0x7F800000 ) {
return x ;
} else if (ix == 0x3F800000 ) {
return 0 ;
}
ix += 0x3F800000 - 0x3F3504F3 ;
k += @as (i32 , @intCast (ix >> 23 )) - 0x7F ;
ix = (ix & 0x007FFFFF ) + 0x3F3504F3 ;
x = @bitCast (ix );
const f = x - 1.0 ;
const s = f / (2.0 + f );
const z = s * s ;
const w = z * z ;
const t1 = w * (Lg2 + w * Lg4 );
const t2 = z * (Lg1 + w * Lg3 );
const R = t2 + t1 ;
const hfsq = 0.5 * f * f ;
var hi = f - hfsq ;
u = @bitCast (hi );
u &= 0xFFFFF000 ;
hi = @bitCast (u );
const lo = f - hi - hfsq + s * (hfsq + R );
return (lo + hi ) * ivln2lo + lo * ivln2hi + hi * ivln2hi + @as (f32 , @floatFromInt (k ));
}