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 › copysign Public Namespace copysign Doc Source Public Namespace Namespaces Functions pub fn expect (ok : bool ) !void This function is intended to be used only in tests. When ok is false, returns a test failure error.
pub fn copysign (magnitude : anytype , sign : @TypeOf (magnitude )) @TypeOf (magnitude ) Returns a value with the magnitude of magnitude and the sign of sign .
File math/copysign.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 const std = @import ("../std.zig " );
const math = std .math ;
const expect = std .testing .expect ;
/// Returns a value with the magnitude of `magnitude` and the sign of `sign`.
pub fn copysign (magnitude : anytype , sign : @TypeOf (magnitude )) @TypeOf (magnitude ) {
const T = @TypeOf (magnitude );
const TBits = @Int (.unsigned , @typeInfo (T ).float .bits );
const sign_bit_mask = @as (TBits , 1 ) << (@bitSizeOf (T ) - 1 );
const mag = @as (TBits , @bitCast (magnitude )) & ~sign_bit_mask ;
const sgn = @as (TBits , @bitCast (sign )) & sign_bit_mask ;
return @as (T , @bitCast (mag | sgn ));
}
test copysign {
inline for ([_ ]type { f16 , f32 , f64 , f80 , f128 }) |T | {
try expect (copysign (@as (T , 1.0 ), @as (T , 1.0 )) == 1.0 );
try expect (copysign (@as (T , 2.0 ), @as (T , -2.0 )) == -2.0 );
try expect (copysign (@as (T , -3.0 ), @as (T , 3.0 )) == 3.0 );
try expect (copysign (@as (T , -4.0 ), @as (T , -4.0 )) == -4.0 );
try expect (copysign (@as (T , 5.0 ), @as (T , -500.0 )) == -5.0 );
try expect (copysign (math .inf (T ), @as (T , -0.0 )) == -math .inf (T ));
try expect (copysign (@as (T , 6.0 ), -math .nan (T )) == -6.0 );
}
}