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 standard library.
std › math › complex › exp › exp32 Private Function exp32 Doc Source Private Function std.math.complex.exp.exp32
fn exp32 (z : Complex (f32 )) Complex (f32 ) Params File math/complex/exp.zig: 26
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 fn exp32 (z : Complex (f32 )) Complex (f32 ) {
const exp_overflow = 0x42b17218 ; // max_exp * ln2 ~= 88.72283955
const cexp_overflow = 0x43400074 ; // (max_exp - min_denom_exp) * ln2
const x = z .re ;
const y = z .im ;
const hy = @as (u32 , @bitCast (y )) & 0x7fffffff ;
// cexp(x + i0) = exp(x) + i0
if (hy == 0 ) {
return Complex (f32 ).init (@exp (x ), y );
}
const hx = @as (u32 , @bitCast (x ));
// cexp(0 + iy) = cos(y) + isin(y)
if ((hx & 0x7fffffff ) == 0 ) {
return Complex (f32 ).init (@cos (y ), @sin (y ));
}
if (hy >= 0x7f800000 ) {
// cexp(finite|nan +- i inf|nan) = nan + i nan
if ((hx & 0x7fffffff ) != 0x7f800000 ) {
return Complex (f32 ).init (y - y , y - y );
} // cexp(-inf +- i inf|nan) = 0 + i0
else if (hx & 0x80000000 != 0 ) {
return Complex (f32 ).init (0 , 0 );
} // cexp(+inf +- i inf|nan) = inf + i nan
else {
return Complex (f32 ).init (x , y - y );
}
}
// 88.7 <= x <= 192 so must scale
if (hx >= exp_overflow and hx <= cexp_overflow ) {
return ldexp_cexp (z , 0 );
} // - x < exp_overflow => exp(x) won't overflow (common)
// - x > cexp_overflow, so exp(x) * s overflows for s > 0
// - x = +-inf
// - x = nan
else {
const exp_x = @exp (x );
return Complex (f32 ).init (exp_x * @cos (y ), exp_x * @sin (y ));
}
}