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 › compiler_rt/ › sincos.zig › sincosf
sincosf
sincos.sincosf
pub fn sincosf (x : f32 , r_sin : *f32 , r_cos : *f32 ) callconv (.c ) void
File
Code
pub fn sincosf (x : f32 , r_sin : *f32 , r_cos : *f32 ) callconv (.c ) void {
const sc1pio2 : f64 = 1.0 * math .pi / 2.0 ;
const sc2pio2 : f64 = 2.0 * math .pi / 2.0 ;
const sc3pio2 : f64 = 3.0 * math .pi / 2.0 ;
const sc4pio2 : f64 = 4.0 * math .pi / 2.0 ;
const pre_ix = @as (u32 , @bitCast (x ));
const sign = pre_ix >> 31 != 0 ;
const ix = pre_ix & 0x7fffffff ;
if (ix <= 0x3f490fda ) {
if (ix < 0x39800000 ) {
if (compiler_rt .want_float_exceptions ) {
if (ix < 0x00100000 ) {
mem .doNotOptimizeAway (x / 0x1p120 );
} else {
mem .doNotOptimizeAway (x + 0x1p120 );
}
}
r_sin .* = x ;
r_cos .* = 1.0 ;
return ;
}
r_sin .* = trig .sindf (x );
r_cos .* = trig .cosdf (x );
return ;
}
if (ix <= 0x407b53d1 ) {
if (ix <= 0x4016cbe3 ) {
if (sign ) {
r_sin .* = -trig .cosdf (x + sc1pio2 );
r_cos .* = trig .sindf (x + sc1pio2 );
} else {
r_sin .* = trig .cosdf (sc1pio2 - x );
r_cos .* = trig .sindf (sc1pio2 - x );
}
return ;
}
r_sin .* = -trig .sindf (if (sign ) x + sc2pio2 else x - sc2pio2 );
r_cos .* = -trig .cosdf (if (sign ) x + sc2pio2 else x - sc2pio2 );
return ;
}
if (ix <= 0x40e231d5 ) {
if (ix <= 0x40afeddf ) {
if (sign ) {
r_sin .* = trig .cosdf (x + sc3pio2 );
r_cos .* = -trig .sindf (x + sc3pio2 );
} else {
r_sin .* = -trig .cosdf (x - sc3pio2 );
r_cos .* = trig .sindf (x - sc3pio2 );
}
return ;
}
r_sin .* = trig .sindf (if (sign ) x + sc4pio2 else x - sc4pio2 );
r_cos .* = trig .cosdf (if (sign ) x + sc4pio2 else x - sc4pio2 );
return ;
}
if (ix >= 0x7f800000 ) {
const result = x - x ;
r_sin .* = result ;
r_cos .* = result ;
return ;
}
var y : f64 = undefined ;
const n = rem_pio2f (x , &y );
const s = trig .sindf (y );
const c = trig .cosdf (y );
switch (n & 3 ) {
0 => {
r_sin .* = s ;
r_cos .* = c ;
},
1 => {
r_sin .* = c ;
r_cos .* = -s ;
},
2 => {
r_sin .* = -s ;
r_cos .* = -c ;
},
else => {
r_sin .* = -c ;
r_cos .* = s ;
},
}
}