25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "libm.h"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include "xpg6.h" /* __xpg6 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <stdio.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <float.h> /* DBL_MAX, DBL_MIN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <unistd.h> /* write */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if defined(__x86)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <ieeefp.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#undef fp_class
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define fp_class fpclass
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define fp_quiet FP_QNAN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <errno.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#undef fflush
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/isa_defs.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* INDENT OFF */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Report libm exception error according to System V Interface Definition
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * (SVID).
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Error mapping:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 1 -- acos(|x|>1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 2 -- asin(|x|>1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 3 -- atan2(+-0,+-0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 4 -- hypot overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 5 -- cosh overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 6 -- exp overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 7 -- exp underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 8 -- y0(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 9 -- y0(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 10-- y1(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 11-- y1(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 12-- yn(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 13-- yn(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 14-- lgamma(finite) overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 15-- lgamma(-integer)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 16-- log(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 17-- log(x<0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 18-- log10(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 19-- log10(x<0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 20-- pow(0.0,0.0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 21-- pow(x,y) overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 22-- pow(x,y) underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 23-- pow(0,negative)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 24-- pow(neg,non-integral)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 25-- sinh(finite) overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 26-- sqrt(negative)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 27-- fmod(x,0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 28-- remainder(x,0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 29-- acosh(x<1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 30-- atanh(|x|>1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 31-- atanh(|x|=1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 32-- scalb overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 33-- scalb underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 34-- j0(|x|>X_TLOSS)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 35-- y0(x>X_TLOSS)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 36-- j1(|x|>X_TLOSS)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 37-- y1(x>X_TLOSS)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 38-- jn(|x|>X_TLOSS, n)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 39-- yn(x>X_TLOSS, n)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 40-- gamma(finite) overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 41-- gamma(-integer)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 42-- pow(NaN,0.0) return NaN for SVID/XOPEN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 43-- log1p(-1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 44-- log1p(x<-1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 45-- logb(0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 46-- nextafter overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 47-- scalb(x,inf)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* INDENT ON */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic double setexception(int, double);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic const union {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned x[2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} C[] = {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef _LITTLE_ENDIAN
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { 0xffffffff, 0x7fffffff },
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { 0x54442d18, 0x400921fb },
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { 0x7fffffff, 0xffffffff },
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis { 0x400921fb, 0x54442d18 },
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis};
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define NaN C[0].d
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define PI_RZ C[1].d
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __HI(x) ((unsigned *)&x)[HIWORD]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __LO(x) ((unsigned *)&x)[LOWORD]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#undef Inf
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define Inf HUGE_VAL
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisdouble
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis_SVID_libm_err(double x, double y, int type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct exception exc;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double t, w, ieee_retval = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis enum version lib_version = _lib_version;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int iy;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* force libm_ieee behavior in SUSv3 mode */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((__xpg6 & _C99SUSv3_math_errexcept) != 0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lib_version = libm_ieee;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) fflush(stdout);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.arg1 = x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.arg2 = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* acos(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "acos";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "acos: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 2:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* asin(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "asin";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "asin: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 3:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atan2(+-0,+-0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.arg1 = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.arg2 = x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "atan2";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = copysign(1.0, x) == 1.0 ? y :
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis copysign(PI_RZ + DBL_MIN, y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atan2: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 4:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* hypot(finite,finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "hypot";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = Inf;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 5:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* cosh(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "cosh";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 6:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* exp(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "exp";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 7:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* exp(finite) underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = UNDERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "exp";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(1, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 8:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y0";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y0: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 9:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y0";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y0: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 10:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y1";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y1: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 11:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y1";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y1: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 12:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(n,0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "yn";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "yn: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 13:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "yn";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "yn: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 14:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* lgamma(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "lgamma";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 15:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* lgamma(-integer) or lgamma(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "lgamma";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "lgamma: SING error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 16:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log: SING error\n", 16);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 17:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log: DOMAIN error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 18:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log10(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log10";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log10: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 19:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log10(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log10";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log10: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 20:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(0.0,0.0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* error only if lib_version == c_issue_4 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 1.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version != c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 1.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "pow(0,0): DOMAIN error\n", 23);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 21:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(x,y) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = (lib_version == c_issue_4)? HUGE : HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (signbit(x)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis t = rint(y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t == y) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis w = rint(0.5 * y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t != w + w) { /* y is odd */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -exc.retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, exc.retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 22:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(x,y) underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = UNDERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (signbit(x)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis t = rint(y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t == y) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis w = rint(0.5 * y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t != w + w) /* y is odd */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -exc.retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(1, exc.retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 23:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* (+-0)**neg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int ahy, k, j, yisint, ly, hx;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* INDENT OFF */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * determine if y is an odd int when x = -0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * yisint = 0 ... y is not an integer
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * yisint = 1 ... y is an odd int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * yisint = 2 ... y is an even int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* INDENT ON */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis hx = __HI(x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ahy = __HI(y)&0x7fffffff;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ly = __LO(y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yisint = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (ahy >= 0x43400000) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yisint = 2; /* even integer y */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (ahy >= 0x3ff00000) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis k = (ahy >> 20) - 0x3ff; /* exponent */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (k > 20) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis j = ly >> (52 - k);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((j << (52 - k)) == ly)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yisint = 2 - (j & 1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (ly == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis j = ahy >> (20 - k);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((j << (20 - k)) == ahy)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis yisint = 2 - (j & 1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (hx < 0 && yisint == 1)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = -ieee_retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "pow(0,neg): DOMAIN error\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis 25);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 24:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* neg**non-integral */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval; /* X/Open allow NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "neg**non-integral: DOMAIN error\n", 32);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 25:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* sinh(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "sinh";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = copysign(Inf, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0.0 ? HUGE : -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 26:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* sqrt(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "sqrt";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval; /* quiet NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "sqrt: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 27:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* fmod(x,0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "fmod";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (fp_class(x) == fp_quiet)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = NaN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "fmod: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 28:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* remainder(x,0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "remainder";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (fp_class(x) == fp_quiet)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = NaN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = NaN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "remainder: DOMAIN error\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis 24);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 29:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* acosh(x<1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "acosh";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = NaN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "acosh: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 30:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atanh(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "atanh";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = NaN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atanh: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 31:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atanh(|x|=1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "atanh";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atanh: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 32:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb overflow; SVID also returns +-HUGE_VAL */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "scalb";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 33:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = UNDERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "scalb";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(1, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval; /* +-0.0 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 34:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* j0(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "j0";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 35:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y0";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 36:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* j1(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "j1";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 37:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "y1";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = y;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 38:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* jn(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* incorrect ieee value: ieee should never be here */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "jn";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 0.0; /* shall not be used */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 39:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* incorrect ieee value: ieee should never be here */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = TLOSS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "yn";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 0.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 0.0; /* shall not be used */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, exc.name, 2);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, ": TLOSS error\n", 14);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 40:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* gamma(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "gamma";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 41:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* gamma(-integer) or gamma(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "gamma";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "gamma: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 42:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(NaN,0.0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* error if lib_version == c_issue_4 or ansi_1 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "pow";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 1.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = 1.0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((lib_version == c_issue_4) || (lib_version == ansi_1))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 43:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log1p(-1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = SING;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log1p";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log1p: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 44:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log1p(x<-1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "log1p";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(3, 1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (!matherr(&exc)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log1p: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 45:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* logb(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "logb";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(0, -1.0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 46:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* nextafter overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = OVERFLOW;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.name = "nextafter";
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The value as returned by setexception is +/-DBL_MAX in
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * round-to-{zero,-/+Inf} mode respectively, which is not
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * usable.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) setexception(2, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = x > 0 ? Inf : -Inf;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == strict_ansi)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if (!matherr(&exc))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 47:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb(x,inf) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis iy = ((int *)&y)[HIWORD];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (lib_version == c_issue_4)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* SVID3: ERANGE in all cases */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = ERANGE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis else if ((x == 0.0 && iy > 0) || (!finite(x) && iy < 0))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* EDOM for scalb(0,+inf) or scalb(inf,-inf) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis errno = EDOM;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval = ((iy < 0)? x / -y : x * y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (lib_version) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case c_issue_4:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case ansi_1:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case strict_ansi:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (exc.retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* NOTREACHED */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis default:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (ieee_retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* NOTREACHED */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic double
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtissetexception(int n, double x) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * n =
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 0 division by zero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 1 underflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 2 overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 3 invalid
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis volatile double one = 1.0, zero = 0.0, retv;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis switch (n) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0: /* division by zero */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retv = copysign(one / zero, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 1: /* underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retv = DBL_MIN * copysign(DBL_MIN, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 2: /* overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retv = DBL_MAX * copysign(DBL_MAX, x);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 3: /* invalid */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retv = zero * Inf; /* for Cheetah */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis break;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (retv);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}