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 › ilogb › ilogbX Private Function ilogbX Doc Source Private Function std.math.ilogb.ilogbX
fn ilogbX (comptime T : type , x : T ) i32 Params File math/ilogb.zig: 28
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 fn ilogbX (comptime T : type , x : T ) i32 {
const typeWidth = @typeInfo (T ).float .bits ;
const significandBits = math .floatMantissaBits (T );
const exponentBits = math .floatExponentBits (T );
const Z = @Int (.unsigned , typeWidth );
const signBit = (@as (Z , 1 ) << (significandBits + exponentBits ));
const maxExponent = ((1 << exponentBits ) - 1 );
const exponentBias = (maxExponent >> 1 );
const absMask = signBit - 1 ;
const u = @as (Z , @bitCast (x )) & absMask ;
const e : i32 = @intCast (u >> significandBits );
if (e == 0 ) {
if (u == 0 ) {
math .raiseInvalid ();
return fp_ilogb0 ;
}
// offset sign bit, exponent bits, and integer bit (if present) + bias
const offset = 1 + exponentBits + @as (comptime_int , @intFromBool (T == f80 )) - exponentBias ;
return offset - @as (i32 , @intCast (@clz (u )));
}
if (e == maxExponent ) {
math .raiseInvalid ();
if (u > @as (Z , @bitCast (math .inf (T )))) {
return fp_ilogbnan ; // u is a NaN
} else return maxInt (i32 );
}
return e - exponentBias ;
}