view lib/sinl.c @ 17463:203c036eb0c6

bootstrap: support checksum utils without a --status option * build-aux/bootstrap: Only look for sha1sum if updating po files. Add sha1 to the list of supported checksum utils since it's now supported through adjustments below. (update_po_files): Remove the use of --status in a way that will suppress all error messages, but since this is only used to minimize updates, it shouldn't cause an issue. Exit early if there is a problem updating the po file checksums. (find_tool): Remove the check for --version support as this is optional as per commit 86186b17. Don't even check for the presence of the command as if that is needed, it's supported through configuring prerequisites in bootstrap.conf. Prompt that when a tool isn't found, one can define an environment variable to add to the hardcoded search list.
author Pádraig Brady <P@draigBrady.com>
date Thu, 08 Aug 2013 11:08:49 +0100 (2013-08-08)
parents 2074f2bf7216
children
line wrap: on
line source
/* s_sinl.c -- long double version of s_sin.c.
 * Conversion to long double by Jakub Jelinek, jj@ultra.linux.cz.
 */

/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

#include <config.h>

/* Specification.  */
#include <math.h>

#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE

long double
sinl (long double x)
{
  return sin (x);
}

#else

/* Code based on glibc/sysdeps/ieee754/ldbl-128/s_sinl.c.  */

/* sinl(x)
 * Return sine function of x.
 *
 * kernel function:
 *      __kernel_sinl           ... sine function on [-pi/4,pi/4]
 *      __kernel_cosl           ... cosine function on [-pi/4,pi/4]
 *      __ieee754_rem_pio2l     ... argument reduction routine
 *
 * Method.
 *      Let S,C and T denote the sin, cos and tan respectively on
 *      [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
 *      in [-pi/4 , +pi/4], and let n = k mod 4.
 *      We have
 *
 *          n        sin(x)      cos(x)        tan(x)
 *     ----------------------------------------------------------
 *          0          S           C             T
 *          1          C          -S            -1/T
 *          2         -S          -C             T
 *          3         -C           S            -1/T
 *     ----------------------------------------------------------
 *
 * Special cases:
 *      Let trig be any of sin, cos, or tan.
 *      trig(+-INF)  is NaN, with signals;
 *      trig(NaN)    is that NaN;
 *
 * Accuracy:
 *      TRIG(x) returns trig(x) nearly rounded
 */

# include "trigl.h"

long double
sinl (long double x)
{
  long double y[2], z = 0.0L;
  int n;

  /* sinl(NaN) is NaN */
  if (isnanl (x))
    return x;

  /* |x| ~< pi/4 */
  if (x >= -0.7853981633974483096156608458198757210492
      && x <= 0.7853981633974483096156608458198757210492)
    return kernel_sinl (x, z, 0);

    /* sinl(Inf) is NaN, sinl(0) is 0 */
  else if (x + x == x)
    return x - x;               /* NaN */

  /* argument reduction needed */
  else
    {
      n = ieee754_rem_pio2l (x, y);
      switch (n & 3)
        {
        case 0:
          return kernel_sinl (y[0], y[1], 1);
        case 1:
          return kernel_cosl (y[0], y[1]);
        case 2:
          return -kernel_sinl (y[0], y[1], 1);
        default:
          return -kernel_cosl (y[0], y[1]);
        }
    }
}

#endif

#if 0
int
main (void)
{
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *29));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *2));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *30));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *4));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *32));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *2/3));
  printf ("%.16Lg\n", sinl (0.7853981633974483096156608458198757210492 *4/3));
}
#endif