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 › sqrt › sqrt32 Private Function sqrt32 Doc Source Private Function std.math.complex.sqrt.sqrt32
fn sqrt32 (z : Complex (f32 )) Complex (f32 ) Params File math/complex/sqrt.zig: 25
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 fn sqrt32 (z : Complex (f32 )) Complex (f32 ) {
const x = z .re ;
const y = z .im ;
if (x == 0 and y == 0 ) {
return Complex (f32 ).init (0 , y );
}
if (math .isInf (y )) {
return Complex (f32 ).init (math .inf (f32 ), y );
}
if (math .isNan (x )) {
// raise invalid if y is not nan
const t = (y - y ) / (y - y );
return Complex (f32 ).init (x , t );
}
if (math .isInf (x )) {
// sqrt(inf + i nan) = inf + nan i
// sqrt(inf + iy) = inf + i0
// sqrt(-inf + i nan) = nan +- inf i
// sqrt(-inf + iy) = 0 + inf i
if (math .signbit (x )) {
return Complex (f32 ).init (@abs (y - y ), math .copysign (x , y ));
} else {
return Complex (f32 ).init (x , math .copysign (y - y , y ));
}
}
// y = nan special case is handled fine below
// double-precision avoids overflow with correct rounding.
const dx = @as (f64 , x );
const dy = @as (f64 , y );
if (dx >= 0 ) {
const t = @sqrt ((dx + math .hypot (dx , dy )) * 0.5 );
return Complex (f32 ).init (
@as (f32 , @floatCast (t )),
@as (f32 , @floatCast (dy / (2.0 * t ))),
);
} else {
const t = @sqrt ((-dx + math .hypot (dx , dy )) * 0.5 );
return Complex (f32 ).init (
@as (f32 , @floatCast (@abs (y ) / (2.0 * t ))),
@as (f32 , @floatCast (math .copysign (t , y ))),
);
}
}