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 › expf
expf
exp.expf
pub fn expf (x_ : f32 ) callconv (.c ) f32
File
Code
pub fn expf (x_ : f32 ) callconv (.c ) f32 {
const half = [_ ]f32 { 0.5 , -0.5 };
const ln2hi = 6.9314575195e-1 ;
const ln2lo = 1.4286067653e-6 ;
const invln2 = 1.4426950216e+0 ;
const P1 = 1.6666625440e-1 ;
const P2 = -2.7667332906e-3 ;
var x = x_ ;
var hx : u32 = @bitCast (x );
const sign : i32 = @intCast (hx >> 31 );
hx &= 0x7FFFFFFF ;
if (math .isNan (x )) {
return x ;
}
if (hx >= 0x42AEAC50 ) {
if (hx > 0x7F800000 ) {
return x ;
}
if (hx >= 0x42b17218 and sign == 0 ) {
return x * 0x1.0p127 ;
}
if (sign != 0 ) {
if (compiler_rt .want_float_exceptions ) mem .doNotOptimizeAway (-0x1.0p-149 / x );
// x <= -103.972084
if (hx >= 0x42CFF1B5 ) {
return 0 ;
}
}
}
var k : i32 = undefined ;
var hi : f32 = undefined ;
var lo : f32 = undefined ;
if (hx > 0x3EB17218 ) {
if (hx > 0x3F851592 ) {
k = @intFromFloat (invln2 * x + half [@intCast (sign )]);
} else {
k = 1 - sign - sign ;
}
const fk : f32 = @floatFromInt (k );
hi = x - fk * ln2hi ;
lo = fk * ln2lo ;
x = hi - lo ;
}
else if (hx > 0x39000000 ) {
k = 0 ;
hi = x ;
lo = 0 ;
} else {
if (compiler_rt .want_float_exceptions ) mem .doNotOptimizeAway (0x1.0p127 + x );
return 1 + x ;
}
const xx = x * x ;
const c = x - xx * (P1 + xx * P2 );
const y = 1 + (x * c / (2 - c ) - lo + hi );
if (k == 0 ) {
return y ;
} else {
return math .scalbn (y , k );
}
}