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/ › complex/ › sqrt.zig › sqrt32
sqrt32
sqrt.sqrt32
fn sqrt32 (z : Complex (f32 )) Complex (f32 )
File
Code
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 )) {
const t = (y - y ) / (y - y );
return Complex (f32 ).init (x , t );
}
if (math .isInf (x )) {
// 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 ));
}
}
// 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 ))),
);
}
}