📄 standard.c
字号:
//===========================================================================
//
// signgam.cxx
//
// Support sign of the gamma*() functions in Math library
//
//===========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos 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 General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//===========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): jlarmour
// Contributors: jlarmour
// Date: 1998-02-13
// Purpose:
// Description: Contains the accessor functions to get and set the stored sign
// of the gamma*() functions in the math library
// Usage:
//
//####DESCRIPTIONEND####
//
//===========================================================================
/* @(#)k_standard.c 1.3 95/01/18 */
/*
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunSoft, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*
*/
// CONFIGURATION
#include <pkgconf/libm.h> // Configuration header
// Include the Math library?
#ifdef CYGPKG_LIBM
// INCLUDES
#include <cyg/infra/cyg_type.h> // Common type definitions and support
#include <cyg/infra/cyg_trac.h> // Tracing macros
#include <math.h> // Main header for math library
#include "mathincl/fdlibm.h" // Internal header for math library
#include <cyg/error/codes.h> // standard error codes
#ifndef CYGSEM_LIBM_COMPAT_IEEE_ONLY
#include <errno.h>
#else
static int errno; // this whole file won't be used if we're IEEE only, but
// doing this keeps the compiler happy
#endif
#ifdef CYGSEM_LIBM_USE_STDERR
#include <stdio.h>
#define WRITE2(u,v) fputs(u, stderr)
#else
#define WRITE2(u,v) 0
#endif // ifdef CYGSEM_LIBM_USE_STDERR
// GLOBALS
static const double zero = 0.0;
// FUNCTIONS
/*
* Standard conformance (non-IEEE) on exception cases.
* Mapping:
* 1 -- acos(|x|>1)
* 2 -- asin(|x|>1)
* 3 -- atan2(+-0,+-0)
* 4 -- hypot overflow
* 5 -- cosh overflow
* 6 -- exp overflow
* 7 -- exp underflow
* 8 -- y0(0)
* 9 -- y0(-ve)
* 10-- y1(0)
* 11-- y1(-ve)
* 12-- yn(0)
* 13-- yn(-ve)
* 14-- lgamma(finite) overflow
* 15-- lgamma(-integer)
* 16-- log(0)
* 17-- log(x<0)
* 18-- log10(0)
* 19-- log10(x<0)
* 20-- pow(0.0,0.0)
* 21-- pow(x,y) overflow
* 22-- pow(x,y) underflow
* 23-- pow(0,negative)
* 24-- pow(neg,non-integral)
* 25-- sinh(finite) overflow
* 26-- sqrt(negative)
* 27-- fmod(x,0)
* 28-- remainder(x,0)
* 29-- acosh(x<1)
* 30-- atanh(|x|>1)
* 31-- atanh(|x|=1)
* 32-- scalb overflow
* 33-- scalb underflow
* 34-- j0(|x|>X_TLOSS)
* 35-- y0(x>X_TLOSS)
* 36-- j1(|x|>X_TLOSS)
* 37-- y1(x>X_TLOSS)
* 38-- jn(|x|>X_TLOSS, n)
* 39-- yn(x>X_TLOSS, n)
* 40-- gamma(finite) overflow
* 41-- gamma(-integer)
* 42-- pow(NaN,0.0)
* 43-- ldexp overflow
* 44-- ldexp underflow
*/
double
__kernel_standard(double x, double y, int type)
{
struct exception exc;
#ifdef CYGSEM_LIBM_USE_STDERR
(void) fflush(stdout);
#endif
exc.arg1 = x;
exc.arg2 = y;
switch(type) {
case 1:
/* acos(|x|>1) */
exc.type = DOMAIN;
exc.name = "acos";
exc.retval = zero;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = EDOM;
else if (!matherr(&exc)) {
if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID) {
(void) WRITE2("acos: DOMAIN error\n", 19);
}
errno = EDOM;
}
break;
case 2:
/* asin(|x|>1) */
exc.type = DOMAIN;
exc.name = "asin";
exc.retval = zero;
if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = EDOM;
else if (!matherr(&exc)) {
if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID) {
(void) WRITE2("asin: DOMAIN error\n", 19);
}
errno = EDOM;
}
break;
case 3:
/* atan2(+-0,+-0) */
exc.arg1 = y;
exc.arg2 = x;
exc.type = DOMAIN;
exc.name = "atan2";
exc.retval = zero;
if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = EDOM;
else if (!matherr(&exc)) {
if(cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID) {
(void) WRITE2("atan2: DOMAIN error\n", 20);
}
errno = EDOM;
}
break;
case 4:
/* hypot(finite,finite) overflow */
exc.type = OVERFLOW;
exc.name = "hypot";
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID)
exc.retval = HUGE;
else
exc.retval = HUGE_VAL;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = ERANGE;
else if (!matherr(&exc)) {
errno = ERANGE;
}
break;
case 5:
/* cosh(finite) overflow */
exc.type = OVERFLOW;
exc.name = "cosh";
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID)
exc.retval = HUGE;
else
exc.retval = HUGE_VAL;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = ERANGE;
else if (!matherr(&exc)) {
errno = ERANGE;
}
break;
case 6:
/* exp(finite) overflow */
exc.type = OVERFLOW;
exc.name = "exp";
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID)
exc.retval = HUGE;
else
exc.retval = HUGE_VAL;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = ERANGE;
else if (!matherr(&exc)) {
errno = ERANGE;
}
break;
case 7:
/* exp(finite) underflow */
exc.type = UNDERFLOW;
exc.name = "exp";
exc.retval = zero;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = ERANGE;
else if (!matherr(&exc)) {
errno = ERANGE;
}
break;
case 8:
/* y0(0) = -inf */
exc.type = DOMAIN; /* should be SING for IEEE */
exc.name = "y0";
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_SVID)
exc.retval = -HUGE;
else
exc.retval = -HUGE_VAL;
if (cyg_libm_get_compat_mode() == CYGNUM_LIBM_COMPAT_POSIX)
errno = EDOM;
else if (!matherr(&exc)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -