25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* INDENT OFF */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Report libm exception error according to System V Interface Definition
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 * 9 -- y0(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 11-- y1(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 13-- yn(-ve)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 14-- lgamma(finite) overflow
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 15-- lgamma(-integer)
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/* INDENT ON */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic double setexception(int, double);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic const union {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned x[2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis_SVID_libm_err(double x, double y, int type) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* force libm_ieee behavior in SUSv3 mode */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((__xpg6 & _C99SUSv3_math_errexcept) != 0)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* acos(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "acos: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* asin(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "asin: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atan2(+-0,+-0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = copysign(1.0, x) == 1.0 ? y :
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atan2: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* hypot(finite,finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* cosh(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* exp(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* exp(finite) underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y0: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y0: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y1: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "y1: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(n,0) = -inf */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.type = DOMAIN; /* should be SING for IEEE */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "yn: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(x<0) = NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "yn: DOMAIN error\n", 17);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* lgamma(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* lgamma(-integer) or lgamma(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "lgamma: SING error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log: DOMAIN error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log10(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log10: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log10(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log10: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(0.0,0.0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* error only if lib_version == c_issue_4 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "pow(0,0): DOMAIN error\n", 23);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(x,y) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = (lib_version == c_issue_4)? HUGE : HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t != w + w) { /* y is odd */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(2, exc.retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(x,y) underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (t != w + w) /* y is odd */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = setexception(1, exc.retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* (+-0)**neg */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* INDENT OFF */
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 /* INDENT ON */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (ly == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "pow(0,neg): DOMAIN error\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* neg**non-integral */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = ieee_retval; /* X/Open allow NaN */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* sinh(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* sqrt(x<0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "sqrt: DOMAIN error\n", 19);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* fmod(x,0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "fmod: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* remainder(x,0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "remainder: DOMAIN error\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* acosh(x<1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "acosh: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atanh(|x|>1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atanh: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* atanh(|x|=1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "atanh: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb overflow; SVID also returns +-HUGE_VAL */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis exc.retval = x > 0.0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb underflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* j0(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y0(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* j1(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* y1(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* jn(|x|>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* incorrect ieee value: ieee should never be here */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 0.0; /* shall not be used */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* yn(x>X_TLOSS) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* incorrect ieee value: ieee should never be here */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ieee_retval = 0.0; /* shall not be used */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* gamma(finite) overflow */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* gamma(-integer) or gamma(0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "gamma: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* pow(NaN,0.0) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* error if lib_version == c_issue_4 or ansi_1 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((lib_version == c_issue_4) || (lib_version == ansi_1))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log1p(-1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log1p: SING error\n", 18);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* log1p(x<-1) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (void) write(2, "log1p: DOMAIN error\n", 20);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* nextafter overflow */
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 exc.retval = x > 0 ? HUGE_VAL : -HUGE_VAL;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* scalb(x,inf) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* SVID3: ERANGE in all cases */
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 exc.retval = ieee_retval = ((iy < 0)? x / -y : x * y);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* NOTREACHED */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /* NOTREACHED */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * 0 division by zero
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis volatile double one = 1.0, zero = 0.0, retv;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis case 0: /* division by zero */