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/ › log10.zig › log10
log10
log10.log10
pub fn log10 (x_ : f64 ) callconv (.c ) f64
File
Code
pub fn log10 (x_ : f64 ) callconv (.c ) f64 {
const ivln10hi : f64 = 4.34294481878168880939e-01 ;
const ivln10lo : f64 = 2.50829467116452752298e-11 ;
const log10_2hi : f64 = 3.01029995663611771306e-01 ;
const log10_2lo : f64 = 3.69423907715893078616e-13 ;
const Lg1 : f64 = 6.666666666666735130e-01 ;
const Lg2 : f64 = 3.999999999940941908e-01 ;
const Lg3 : f64 = 2.857142874366239149e-01 ;
const Lg4 : f64 = 2.222219843214978396e-01 ;
const Lg5 : f64 = 1.818357216161805012e-01 ;
const Lg6 : f64 = 1.531383769920937332e-01 ;
const Lg7 : f64 = 1.479819860511658591e-01 ;
var x = x_ ;
var ix : u64 = @bitCast (x );
var hx : u32 = @intCast (ix >> 32 );
var k : i32 = 0 ;
if (hx < 0x00100000 or hx >> 31 != 0 ) {
if (ix << 1 == 0 ) {
return if (compiler_rt .want_float_exceptions ) -1 / (x * x ) else -std .math .inf (f64 );
}
if (hx >> 31 != 0 ) {
return if (compiler_rt .want_float_exceptions ) (x - x ) / 0.0 else math .nan (f64 );
}
k -= 54 ;
x *= 0x1.0p54 ;
hx = @intCast (@as (u64 , @bitCast (x )) >> 32 );
} else if (hx >= 0x7FF00000 ) {
return x ;
} else if (hx == 0x3FF00000 and ix << 32 == 0 ) {
return 0 ;
}
hx += 0x3FF00000 - 0x3FE6A09E ;
k += @as (i32 , @intCast (hx >> 20 )) - 0x3FF ;
hx = (hx & 0x000FFFFF ) + 0x3FE6A09E ;
ix = (@as (u64 , hx ) << 32 ) | (ix & 0xFFFFFFFF );
x = @bitCast (ix );
const f = x - 1.0 ;
const hfsq = 0.5 * f * f ;
const s = f / (2.0 + f );
const z = s * s ;
const w = z * z ;
const t1 = w * (Lg2 + w * (Lg4 + w * Lg6 ));
const t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7 )));
const R = t2 + t1 ;
var hi = f - hfsq ;
var hii : u64 = @bitCast (hi );
hii &= @as (u64 , maxInt (u64 )) << 32 ;
hi = @bitCast (hii );
const lo = f - hi - hfsq + s * (hfsq + R );
var val_hi = hi * ivln10hi ;
const dk : f64 = @floatFromInt (k );
const y = dk * log10_2hi ;
var val_lo = dk * log10_2lo + (lo + hi ) * ivln10lo + lo * ivln10hi ;
const ww = y + val_hi ;
val_lo += (y - ww ) + val_hi ;
val_hi = ww ;
return val_lo + val_hi ;
}