Blame specfunc/test_sincos_pi.c

Packit 67cb25
/* specfunc/test_sincos_pi.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 2017 Konrad Griessinger
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
/* Author: Konrad Griessinger */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <stdlib.h>
Packit 67cb25
#include <string.h>
Packit 67cb25
#include <gsl/gsl_math.h>
Packit 67cb25
#include <gsl/gsl_errno.h>
Packit 67cb25
#include <gsl/gsl_ieee_utils.h>
Packit 67cb25
#include <gsl/gsl_test.h>
Packit 67cb25
#include <gsl/gsl_sf.h>
Packit 67cb25
#include "test_sf.h"
Packit 67cb25
Packit 67cb25
/* Any double precision number bigger than this is automatically an even integer. */
Packit 67cb25
#define BIGDBL (2.0 / GSL_DBL_EPSILON)
Packit 67cb25
Packit 67cb25
int
Packit 67cb25
test_sincos_pi(void)
Packit 67cb25
{
Packit 67cb25
  gsl_sf_result r;
Packit 67cb25
  int s = 0;
Packit 67cb25
  int k = 0, kmax = 12;
Packit 67cb25
  double x = 0.0, ix = 0.0, fx = 0.0, exact = 0.0;
Packit 67cb25
Packit 67cb25
  /* sin_pi tests */
Packit 67cb25
Packit 67cb25
  fx = 0.5;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  fx = -0.5;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 1.5;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  fx = -1.5;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 2.5;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  fx = -2.5;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 3.5;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  fx = -3.5;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 0.375;
Packit 67cb25
  exact = 0.923879532511286756128183189397;
Packit 67cb25
  
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = -0.375;
Packit 67cb25
  exact = -0.923879532511286756128183189397;
Packit 67cb25
  
Packit 67cb25
  TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  
Packit 67cb25
  fx = 0.0;
Packit 67cb25
  exact = 0.0;
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.5;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.03125;
Packit 67cb25
  exact = 0.0980171403295606019941955638886;
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  
Packit 67cb25
  fx = 0.0625;
Packit 67cb25
  exact = 0.195090322016128267848284868477;
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  fx = 0.75;
Packit 67cb25
  exact = 0.707106781186547524400844362105;
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.0078125;
Packit 67cb25
  exact = 0.0245412285229122880317345294593;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  /* sin_pi tests for very large arguments */
Packit 67cb25
Packit 67cb25
  fx = 0.0625;
Packit 67cb25
  exact = 0.195090322016128267848284868477;
Packit 67cb25
  ix = LONG_MAX + 1.0;
Packit 67cb25
  ix += fabs(fmod(ix,2.0)); /* make sure of even number */
Packit 67cb25
  
Packit 67cb25
  for (k=0; k
Packit 67cb25
    x = ix + fx;
Packit 67cb25
    x -= ix; /* careful with compiler optimization */
Packit 67cb25
    if ( ( x != fx ) || ( fabs(ix+fx) >= BIGDBL ) ) break;
Packit 67cb25
    printf("ix+fx= %.18e\n", ix+fx);
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix += 101.0;
Packit 67cb25
    exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  fx = -0.0625;
Packit 67cb25
  exact = -0.195090322016128267848284868477;
Packit 67cb25
  ix = LONG_MIN - 1.0;
Packit 67cb25
  ix -= fabs(fmod(ix,2.0)); /* make sure of even number */
Packit 67cb25
  
Packit 67cb25
  for (k=0; k
Packit 67cb25
    x = ix + fx;
Packit 67cb25
    x -= ix; /* careful with compiler optimization */
Packit 67cb25
    if ( ( x != fx ) || ( fabs(ix+fx) >= BIGDBL ) ) break;
Packit 67cb25
    printf("ix+fx= %.18e\n", ix+fx);
Packit 67cb25
    TEST_SF(s, gsl_sf_sin_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix -= 101.0;
Packit 67cb25
    exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  
Packit 67cb25
  
Packit 67cb25
  /* cos_pi tests */
Packit 67cb25
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  fx = 0.0;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 1.0;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = -1.0;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 2.0;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = -2.0;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = 3.0;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = -3.0;
Packit 67cb25
  exact = -1.0;
Packit 67cb25
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
Packit 67cb25
  fx = 0.375;
Packit 67cb25
  exact = 0.382683432365089771728459984030;
Packit 67cb25
  
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
  fx = -0.375;
Packit 67cb25
  exact = 0.382683432365089771728459984030;
Packit 67cb25
  
Packit 67cb25
  TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
  
Packit 67cb25
  fx = 0.0;
Packit 67cb25
  exact = 1.0;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.5;
Packit 67cb25
  exact = 0.0;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.0625;
Packit 67cb25
  exact = 0.980785280403230449126182236134;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.4375;
Packit 67cb25
  exact = 0.195090322016128267848284868477;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  fx = 0.4921875;
Packit 67cb25
  exact = 0.0245412285229122880317345294593;
Packit 67cb25
  
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(3.0,k+1);
Packit 67cb25
    if (k==0) exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  exact = fabs(exact);
Packit 67cb25
  ix = 0.0;
Packit 67cb25
  for (k=0; k
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix = pow(10.0,k+1);
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  /* cos_pi tests for very large arguments */
Packit 67cb25
Packit 67cb25
  fx = 0.0625;
Packit 67cb25
  exact = 0.980785280403230449126182236134;
Packit 67cb25
  ix = LONG_MAX + 1.0;
Packit 67cb25
  ix += fabs(fmod(ix,2.0)); /* make sure of even number */
Packit 67cb25
  
Packit 67cb25
  for (k=0; k
Packit 67cb25
    x = ix + fx;
Packit 67cb25
    x -= ix; /* careful with compiler optimization */
Packit 67cb25
    if ( ( x != fx ) || ( fabs(ix+fx) >= BIGDBL ) ) break;
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix += 101.0;
Packit 67cb25
    exact = -exact;
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  fx = -0.0625;
Packit 67cb25
  exact = 0.980785280403230449126182236134;
Packit 67cb25
  ix = LONG_MIN - 1.0;
Packit 67cb25
  ix -= fabs(fmod(ix,2.0)); /* make sure of even number */
Packit 67cb25
  
Packit 67cb25
  for (k=0; k
Packit 67cb25
    x = ix + fx;
Packit 67cb25
    x -= ix; /* careful with compiler optimization */
Packit 67cb25
    if ( ( x != fx ) || ( fabs(ix+fx) >= BIGDBL ) ) break;
Packit 67cb25
    TEST_SF(s, gsl_sf_cos_pi_e, (ix+fx, &r), exact, TEST_TOL0, GSL_SUCCESS);
Packit 67cb25
    ix -= 101.0;
Packit 67cb25
    exact = -exact;
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
  return s;
Packit 67cb25
}
Packit 67cb25