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 › sqrt64
sqrt64
sqrt.sqrt64
fn sqrt64 (z : Complex (f64 )) Complex (f64 )
File
Code
fn sqrt64 (z : Complex (f64 )) Complex (f64 ) {
const threshold = 0x1.a827999fcef32p+1022 ;
var x = z .re ;
var y = z .im ;
if (x == 0 and y == 0 ) {
return Complex (f64 ).init (0 , y );
}
if (math .isInf (y )) {
return Complex (f64 ).init (math .inf (f64 ), y );
}
if (math .isNan (x )) {
const t = (y - y ) / (y - y );
return Complex (f64 ).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 (f64 ).init (@abs (y - y ), math .copysign (x , y ));
} else {
return Complex (f64 ).init (x , math .copysign (y - y , y ));
}
}
// scale to avoid overflow
var scale = false ;
if (@abs (x ) >= threshold or @abs (y ) >= threshold ) {
x *= 0.25 ;
y *= 0.25 ;
scale = true ;
}
var result : Complex (f64 ) = undefined ;
if (x >= 0 ) {
const t = @sqrt ((x + math .hypot (x , y )) * 0.5 );
result = Complex (f64 ).init (t , y / (2.0 * t ));
} else {
const t = @sqrt ((-x + math .hypot (x , y )) * 0.5 );
result = Complex (f64 ).init (@abs (y ) / (2.0 * t ), math .copysign (t , y ));
}
if (scale ) {
result .re *= 2 ;
result .im *= 2 ;
}
return result ;
}