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 › tanh › tanh64 Private Function tanh64 Doc Source Private Function std.math.complex.tanh.tanh64
fn tanh64 (z : Complex (f64 )) Complex (f64 ) Params File math/complex/tanh.zig: 61
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 fn tanh64 (z : Complex (f64 )) Complex (f64 ) {
const x = z .re ;
const y = z .im ;
const fx : u64 = @bitCast (x );
// TODO: zig should allow this conversion implicitly because it can notice that the value necessarily
// fits in range.
const hx : u32 = @intCast (fx >> 32 );
const lx : u32 = @truncate (fx );
const ix = hx & 0x7fffffff ;
if (ix >= 0x7ff00000 ) {
if ((ix & 0xfffff ) | lx != 0 ) {
const r = if (y == 0 ) y else x * y ;
return Complex (f64 ).init (x , r );
}
const xx : f64 = @bitCast ((@as (u64 , hx - 0x40000000 ) << 32 ) | lx );
const r = if (math .isInf (y )) y else @sin (y ) * @cos (y );
return Complex (f64 ).init (xx , math .copysign (@as (f64 , 0.0 ), r ));
}
if (!math .isFinite (y )) {
const r = if (ix != 0 ) y - y else x ;
return Complex (f64 ).init (r , y - y );
}
// x >= 22
if (ix >= 0x40360000 ) {
const exp_mx = @exp (-@abs (x ));
return Complex (f64 ).init (math .copysign (@as (f64 , 1.0 ), x ), 4 * @sin (y ) * @cos (y ) * exp_mx * exp_mx );
}
// Kahan's algorithm
const t = @tan (y );
const beta = 1.0 + t * t ;
const s = math .sinh (x );
const rho = @sqrt (1 + s * s );
const den = 1 + beta * s * s ;
return Complex (f64 ).init ((beta * rho * s ) / den , t / den );
}