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/ › exp.zig › exp
exp
exp.exp
pub fn exp (x_ : f64 ) callconv (.c ) f64
File
Code
pub fn exp (x_ : f64 ) callconv (.c ) f64 {
const half = [_ ]f64 { 0.5 , -0.5 };
const ln2hi : f64 = 6.93147180369123816490e-01 ;
const ln2lo : f64 = 1.90821492927058770002e-10 ;
const invln2 : f64 = 1.44269504088896338700e+00 ;
const P1 : f64 = 1.66666666666666019037e-01 ;
const P2 : f64 = -2.77777777770155933842e-03 ;
const P3 : f64 = 6.61375632143793436117e-05 ;
const P4 : f64 = -1.65339022054652515390e-06 ;
const P5 : f64 = 4.13813679705723846039e-08 ;
var x = x_ ;
const ux : u64 = @bitCast (x );
var hx = ux >> 32 ;
const sign : i32 = @intCast (hx >> 31 );
hx &= 0x7FFFFFFF ;
if (math .isNan (x )) {
return x ;
}
if (hx >= 0x4086232B ) {
if (hx > 0x7FF00000 ) {
return x ;
}
if (x > 709.782712893383973096 ) {
return if (compiler_rt .want_float_exceptions ) x * 0x1p1023 else std .math .inf (f64 );
}
if (x < -708.39641853226410622 ) {
if (compiler_rt .want_float_exceptions ) mem .doNotOptimizeAway (-0x0.0000000000001p-1022 / x );
if (x < -745.13321910194110842 ) {
return 0 ;
}
}
}
var k : i32 = undefined ;
var hi : f64 = undefined ;
var lo : f64 = undefined ;
if (hx > 0x3FD62E42 ) {
if (hx > 0x3FF0A2B2 ) {
k = @intFromFloat (invln2 * x + half [@intCast (sign )]);
} else {
k = 1 - sign - sign ;
}
const dk : f64 = @floatFromInt (k );
hi = x - dk * ln2hi ;
lo = dk * ln2lo ;
x = hi - lo ;
}
else if (hx > 0x3E300000 ) {
k = 0 ;
hi = x ;
lo = 0 ;
} else {
if (compiler_rt .want_float_exceptions ) mem .doNotOptimizeAway (0x1.0p1023 + x );
return 1 + x ;
}
const xx = x * x ;
const c = x - xx * (P1 + xx * (P2 + xx * (P3 + xx * (P4 + xx * P5 ))));
const y = 1 + (x * c / (2 - c ) - lo + hi );
if (k == 0 ) {
return y ;
} else {
return math .scalbn (y , k );
}
}