/*
 * IBM Accurate Mathematical Library
 * Written by International Business Machines Corp.
 * Copyright (C) 2001-2014 Free Software Foundation, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

/******************************************************************/
/*                                                                */
/* MODULE_NAME:mpatan.h                                           */
/*                                                                */
/* common data and variables prototype and definition             */
/******************************************************************/

#ifndef MPATAN_H
#define MPATAN_H

extern const number __atan_xm[8] attribute_hidden;
extern const number __atan_twonm1[33] attribute_hidden;
extern const number __atan_twom[8] attribute_hidden;
extern const int __atan_np[33] attribute_hidden;


#ifndef AVOID_MPATAN_H
#ifdef BIG_ENDI
  const number
	    __atan_xm[8] = {                         /* x[m]   */
/**/                  {{0x00000000, 0x00000000} }, /* 0.0    */
/**/                  {{0x3f8930be, 0x00000000} }, /* 0.0123 */
/**/                  {{0x3f991687, 0x00000000} }, /* 0.0245 */
/**/                  {{0x3fa923a2, 0x00000000} }, /* 0.0491 */
/**/                  {{0x3fb930be, 0x00000000} }, /* 0.0984 */
/**/                  {{0x3fc95810, 0x00000000} }, /* 0.198  */
/**/                  {{0x3fda7ef9, 0x00000000} }, /* 0.414  */
/**/                  {{0x3ff00000, 0x00000000} }, /* 1.0    */
		    };
  const number
 __atan_twonm1[33] = {                             /* 2n-1   */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x40260000, 0x00000000} }, /* 11     */
/**/                  {{0x402e0000, 0x00000000} }, /* 15     */
/**/                  {{0x40330000, 0x00000000} }, /* 19     */
/**/                  {{0x40350000, 0x00000000} }, /* 21     */
/**/                  {{0x40390000, 0x00000000} }, /* 25     */
/**/                  {{0x403d0000, 0x00000000} }, /* 29     */
/**/                  {{0x40408000, 0x00000000} }, /* 33     */
/**/                  {{0x40428000, 0x00000000} }, /* 37     */
/**/                  {{0x40448000, 0x00000000} }, /* 41     */
/**/                  {{0x40468000, 0x00000000} }, /* 45     */
/**/                  {{0x40488000, 0x00000000} }, /* 49     */
/**/                  {{0x404a8000, 0x00000000} }, /* 53     */
/**/                  {{0x404b8000, 0x00000000} }, /* 55     */
/**/                  {{0x404d8000, 0x00000000} }, /* 59     */
/**/                  {{0x404f8000, 0x00000000} }, /* 63     */
/**/                  {{0x4050c000, 0x00000000} }, /* 67     */
/**/                  {{0x4051c000, 0x00000000} }, /* 71     */
/**/                  {{0x4052c000, 0x00000000} }, /* 75     */
/**/                  {{0x4053c000, 0x00000000} }, /* 79     */
/**/                  {{0x4054c000, 0x00000000} }, /* 83     */
/**/                  {{0x40554000, 0x00000000} }, /* 85     */
/**/                  {{0x40564000, 0x00000000} }, /* 89     */
/**/                  {{0x40574000, 0x00000000} }, /* 93     */
/**/                  {{0x40584000, 0x00000000} }, /* 97     */
/**/                  {{0x40594000, 0x00000000} }, /* 101    */
/**/                  {{0x405a4000, 0x00000000} }, /* 105    */
/**/                  {{0x405b4000, 0x00000000} }, /* 109    */
/**/                  {{0x405c4000, 0x00000000} }, /* 113    */
/**/                  {{0x405d4000, 0x00000000} }, /* 117    */
		    };

#else
#ifdef LITTLE_ENDI

  const number
      __atan_xm[8] = {                             /* x[m]   */
/**/                  {{0x00000000, 0x00000000} }, /* 0.0    */
/**/                  {{0x00000000, 0x3f8930be} }, /* 0.0123 */
/**/                  {{0x00000000, 0x3f991687} }, /* 0.0245 */
/**/                  {{0x00000000, 0x3fa923a2} }, /* 0.0491 */
/**/                  {{0x00000000, 0x3fb930be} }, /* 0.0984 */
/**/                  {{0x00000000, 0x3fc95810} }, /* 0.198  */
/**/                  {{0x00000000, 0x3fda7ef9} }, /* 0.414  */
/**/                  {{0x00000000, 0x3ff00000} }, /* 1.0    */
		    };
  const number
__atan_twonm1[33] = {                             /* 2n-1   */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x00000000} }, /* 0      */
/**/                  {{0x00000000, 0x40260000} }, /* 11     */
/**/                  {{0x00000000, 0x402e0000} }, /* 15     */
/**/                  {{0x00000000, 0x40330000} }, /* 19     */
/**/                  {{0x00000000, 0x40350000} }, /* 21     */
/**/                  {{0x00000000, 0x40390000} }, /* 25     */
/**/                  {{0x00000000, 0x403d0000} }, /* 29     */
/**/                  {{0x00000000, 0x40408000} }, /* 33     */
/**/                  {{0x00000000, 0x40428000} }, /* 37     */
/**/                  {{0x00000000, 0x40448000} }, /* 41     */
/**/                  {{0x00000000, 0x40468000} }, /* 45     */
/**/                  {{0x00000000, 0x40488000} }, /* 49     */
/**/                  {{0x00000000, 0x404a8000} }, /* 53     */
/**/                  {{0x00000000, 0x404b8000} }, /* 55     */
/**/                  {{0x00000000, 0x404d8000} }, /* 59     */
/**/                  {{0x00000000, 0x404f8000} }, /* 63     */
/**/                  {{0x00000000, 0x4050c000} }, /* 67     */
/**/                  {{0x00000000, 0x4051c000} }, /* 71     */
/**/                  {{0x00000000, 0x4052c000} }, /* 75     */
/**/                  {{0x00000000, 0x4053c000} }, /* 79     */
/**/                  {{0x00000000, 0x4054c000} }, /* 83     */
/**/                  {{0x00000000, 0x40554000} }, /* 85     */
/**/                  {{0x00000000, 0x40564000} }, /* 89     */
/**/                  {{0x00000000, 0x40574000} }, /* 93     */
/**/                  {{0x00000000, 0x40584000} }, /* 97     */
/**/                  {{0x00000000, 0x40594000} }, /* 101    */
/**/                  {{0x00000000, 0x405a4000} }, /* 105    */
/**/                  {{0x00000000, 0x405b4000} }, /* 109    */
/**/                  {{0x00000000, 0x405c4000} }, /* 113    */
/**/                  {{0x00000000, 0x405d4000} }, /* 117    */
		    };

#endif
#endif

  const int
    __atan_np[33] = { 0, 0, 0, 0, 6, 8,10,11,13,15,17,19,21,23,25,27,28,
		      30,32,34,36,38,40,42,43,45,47,49,51,53,55,57,59};

#endif
#endif
