NAME
    cos - returns cosine of scalars and vectors.

SYNOPSIS
      float  cos( float  a );
      float1 cos( float1 a );
      float2 cos( float2 a );
      float3 cos( float3 a );
      float4 cos( float4 a );
 
      half   cos( half  a );
      half1  cos( half1 a );
      half2  cos( half2 a );
      half3  cos( half3 a );
      half4  cos( half4 a );
 
      fixed  cos( fixed  a );
      fixed1 cos( fixed1 a );
      fixed2 cos( fixed2 a );
      fixed3 cos( fixed3 a );
      fixed4 cos( fixed4 a );

PARAMETERS
    a       Vector or scalar of which to determine the cosine.

DESCRIPTION
    Returns the cosine of *a* in radians. The return value is in the range
    [-1,+1].

    For vectors, the returned vector contains the cosine of each element of
    the input vector.

REFERENCE IMPLEMENTATION
    cos is best implemented as a native cosine instruction, however cos for
    a float scalar could be implemented by an approximation like this.

      cos(float a)
      {
        /* C simulation gives a max absolute error of less than 1.8e-7 */
        const float4 c0 = float4( 0.0,            0.5,            1.0,           0.0            );
        const float4 c1 = float4( 0.25,          -9.0,            0.75,          0.159154943091 );
        const float4 c2 = float4( 24.9808039603, -24.9808039603, -60.1458091736, 60.1458091736  );
        const float4 c3 = float4( 85.4537887573, -85.4537887573, -64.9393539429, 64.9393539429  );
        const float4 c4 = float4( 19.7392082214, -19.7392082214, -1.0,           1.0            );

        /* r0.x = cos(a) */
        float3 r0, r1, r2;

        r1.x  = c1.w * a;                       // normalize input
        r1.y  = frac( r1.x );                   // and extract fraction
        r2.x  = (float) ( r1.y < c1.x );        // range check: 0.0 to 0.25
        r2.yz = (float2) ( r1.yy >= c1.yz );    // range check: 0.75 to 1.0
        r2.y  = dot( r2, c4.zwz );              // range check: 0.25 to 0.75
        r0    = c0.xyz - r1.yyy;                // range centering
        r0    = r0 * r0;
        r1    = c2.xyx * r0 + c2.zwz;           // start power series
        r1    =     r1 * r0 + c3.xyx;
        r1    =     r1 * r0 + c3.zwz;
        r1    =     r1 * r0 + c4.xyx;
        r1    =     r1 * r0 + c4.zwz;
        r0.x  = dot( r1, -r2 );                 // range extract

        return r0.x;

PROFILE SUPPORT
    cos is fully supported in all profiles unless otherwise specified.

    cos is supported via an approximation (shown above) in the vs_1, vp20,
    and arbvp1 profiles.

    cos is unsupported in the fp20 and ps_1 profiles.

SEE ALSO
    the acos manpage, the dot manpage, the frac manpage, the sin manpage,
    the tan manpage

