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 › std/ › math/ › expm1.zig › expm1_32
expm1_32
expm1.expm1_32
fn expm1_32 (x_ : f32 ) f32
File
Code
fn expm1_32 (x_ : f32 ) f32 {
if (math .isNan (x_ ))
return math .nan (f32 );
const o_threshold : f32 = 8.8721679688e+01 ;
const ln2_hi : f32 = 6.9313812256e-01 ;
const ln2_lo : f32 = 9.0580006145e-06 ;
const invln2 : f32 = 1.4426950216e+00 ;
const Q1 : f32 = -3.3333212137e-2 ;
const Q2 : f32 = 1.5807170421e-3 ;
var x = x_ ;
const ux : u32 = @bitCast (x );
const hx = ux & 0x7FFFFFFF ;
const sign = ux >> 31 ;
if (math .isNegativeInf (x )) {
return -1.0 ;
}
if (hx >= 0x4195B844 ) {
if (hx > 0x7F800000 ) {
return x ;
}
if (sign != 0 ) {
return -1 ;
}
if (x > o_threshold ) {
x *= 0x1.0p127 ;
return x ;
}
}
var hi : f32 = undefined ;
var lo : f32 = undefined ;
var c : f32 = undefined ;
var k : i32 = undefined ;
if (hx > 0x3EB17218 ) {
if (hx < 0x3F851592 ) {
if (sign == 0 ) {
hi = x - ln2_hi ;
lo = ln2_lo ;
k = 1 ;
} else {
hi = x + ln2_hi ;
lo = -ln2_lo ;
k = -1 ;
}
} else {
var kf = invln2 * x ;
if (sign != 0 ) {
kf -= 0.5 ;
} else {
kf += 0.5 ;
}
k = @as (i32 , @intFromFloat (kf ));
const t = @as (f32 , @floatFromInt (k ));
hi = x - t * ln2_hi ;
lo = t * ln2_lo ;
}
x = hi - lo ;
c = (hi - x ) - lo ;
}
else if (hx < 0x33000000 ) {
if (hx < 0x00800000 ) {
mem .doNotOptimizeAway (x * x );
}
return x ;
} else {
k = 0 ;
}
const hfx = 0.5 * x ;
const hxs = x * hfx ;
const r1 = 1.0 + hxs * (Q1 + hxs * Q2 );
const t = 3.0 - r1 * hfx ;
var e = hxs * ((r1 - t ) / (6.0 - x * t ));
if (k == 0 ) {
return x - (x * e - hxs );
}
e = x * (e - c ) - c ;
e -= hxs ;
if (k == -1 ) {
return 0.5 * (x - e ) - 0.5 ;
}
if (k == 1 ) {
if (x < -0.25 ) {
return -2.0 * (e - (x + 0.5 ));
} else {
return 1.0 + 2.0 * (x - e );
}
}
const twopk = @as (f32 , @bitCast (@as (u32 , @intCast ((0x7F +% k ) << 23 ))));
if (k < 0 or k > 56 ) {
var y = x - e + 1.0 ;
if (k == 128 ) {
y = y * 2.0 * 0x1.0p127 ;
} else {
y = y * twopk ;
}
return y - 1.0 ;
}
const uf : f32 = @bitCast (@as (u32 , @intCast (0x7F -% k )) << 23 );
if (k < 23 ) {
return (x - e + (1 - uf )) * twopk ;
} else {
return (x - (e + uf ) + 1 ) * twopk ;
}
}