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.

cos

kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164 Input x is assumed to be bounded by ~pi/4 in magnitude. Input y is the tail of x.

Algorithm

  1. Since cos(-x) = cos(x), we need only to consider positive x.
  2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
  3. cos(x) is approximated by a polynomial of degree 14 on [0,pi/4] 4 14 cos(x) ~ 1 - xx/2 + C1x + ... + C6*x where the remez error is

| 2 4 6 8 10 12 14 | -58 |cos(x)-(1-.5x +C1x +C2x +C3x +C4x +C5x +C6*x )| <= 2

4 6 8 10 12 14

  1. let r = C1x +C2x +C3x +C4x +C5x +C6x , then cos(x) ~ 1 - xx/2 + r since cos(x+y) ~ cos(x) - sin(x)y ~ cos(x) - xy, a correction term is necessary in cos(x) and hence cos(x+y) = 1 - (xx/2 - (r - xy)) For better accuracy, rearrange to cos(x+y) ~ w + (tmp + (r-xy)) where w = 1 - xx/2 and tmp is a tiny correction term (1 - xx/2 == w + tmp exactly in infinite precision). The exactness of w + tmp in infinite precision depends on w and tmp having the same precision as x. If they have extra precision due to compiler bugs, then the extra precision is only good provided it is retained in all terms of the final expression for cos(). Retention happens in all cases tested under FreeBSD, so don't pessimize things by forcibly clipping any extra precision in w.
trig.cos
pub fn cos(x: f64, y: f64) f64

File

lib/compiler_rt/trig.zig:53

Code

pub fn cos(x: f64, y: f64) f64 {
    const C1 = 4.16666666666666019037e-02; // 0x3FA55555, 0x5555554C
    const C2 = -1.38888888888741095749e-03; // 0xBF56C16C, 0x16C15177
    const C3 = 2.48015872894767294178e-05; // 0x3EFA01A0, 0x19CB1590
    const C4 = -2.75573143513906633035e-07; // 0xBE927E4F, 0x809C52AD
    const C5 = 2.08757232129817482790e-09; // 0x3E21EE9E, 0xBDB4B1C4
    const C6 = -1.13596475577881948265e-11; // 0xBDA8FAE9, 0xBE8838D4

    const z = x * x;
    const zs = z * z;
    const r = z * (C1 + z * (C2 + z * C3)) + zs * zs * (C4 + z * (C5 + z * C6));
    const hz = 0.5 * z;
    const w = 1.0 - hz;
    return w + (((1.0 - w) - hz) + (z * r - x * y));
}