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 › frexp › frexp Public Function frexp Doc Source Public Function std.math.frexp.frexp
pub fn frexp (x : anytype ) Frexp (@TypeOf (x )) Params File math/frexp.zig: 21
21
22
23
24
25
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 pub fn frexp (x : anytype ) Frexp (@TypeOf (x )) {
const T : type = @TypeOf (x );
const bits : comptime_int = @typeInfo (T ).float .bits ;
const Int : type = @Int (.unsigned , bits );
const exp_bits : comptime_int = math .floatExponentBits (T );
const mant_bits : comptime_int = math .floatMantissaBits (T );
const frac_bits : comptime_int = math .floatFractionalBits (T );
const exp_min : comptime_int = math .floatExponentMin (T );
const ExpInt : type = @Int (.unsigned , exp_bits );
const MantInt : type = @Int (.unsigned , mant_bits );
const FracInt : type = @Int (.unsigned , frac_bits );
const unreal_exponent : comptime_int = (1 << exp_bits ) - 1 ;
const bias : comptime_int = (1 << (exp_bits - 1 )) - 2 ;
const exp_mask : comptime_int = unreal_exponent << mant_bits ;
const zero_exponent : comptime_int = bias << mant_bits ;
const sign_mask : comptime_int = 1 << (bits - 1 );
const not_exp : comptime_int = ~@as (Int , exp_mask );
const ones_place : comptime_int = mant_bits - frac_bits ;
const extra_denorm_shift : comptime_int = 1 - ones_place ;
var result : Frexp (T ) = undefined ;
var v : Int = @bitCast (x );
const m : MantInt = @truncate (v );
const e : ExpInt = @truncate (v >> mant_bits );
switch (e ) {
0 => {
if (m != 0 ) {
// subnormal
const offset = @clz (m );
const shift = offset + extra_denorm_shift ;
v &= sign_mask ;
v |= zero_exponent ;
v |= math .shl (MantInt , m , shift );
result .exponent = exp_min - @as (i32 , offset ) + ones_place ;
} else {
// +-0 = (+-0, 0)
result .exponent = 0 ;
}
},
unreal_exponent => {
// +-nan -> {+-nan, undefined}
result .exponent = undefined ;
// +-inf -> {+-inf, 0}
if (@as (FracInt , @truncate (v )) == 0 )
result .exponent = 0 ;
},
else => {
// normal
v &= not_exp ;
v |= zero_exponent ;
result .exponent = @as (i32 , e ) - bias ;
},
}
result .significand = @bitCast (v );
return result ;
}
Breaks x into a normalized fraction and an integral power of two. f == frac * 2^exp, with |frac| in the interval [0.5, 1).
Special Cases: