📄 log10.c
字号:
#ifndef lintstatic char *sccsid ="@(#)log10.c 4.1 (ULTRIX) 7/17/90";#endif lint/************************************************************************ * * * Copyright (c) 1986 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************//************************************************************************** Modification History** David Metsky 14-Jan-86** 001 Added from BSD 4.3 version as part of upgrade** Based on: log10.c 1.2 8/21/85** 002 Reeves, 1989-Nov-27: fixed error handling**************************************************************************//* LOG10(X) * RETURN THE BASE 10 LOGARITHM OF x * DOUBLE PRECISION (VAX D format 56 bits, IEEE DOUBLE 53 BITS) * CODED IN C BY K.C. NG, 1/20/85; * REVISED BY K.C. NG on 1/23/85, 3/7/85, 4/16/85. * * Required kernel function: * log(x) * * Method : * log(x) * log10(x) = --------- or [1/log(10)]*log(x) * log(10) * * Note: * [log(10)] rounded to 56 bits has error .0895 ulps, * [1/log(10)] rounded to 53 bits has error .198 ulps; * therefore, for better accuracy, in VAX D format, we divide * log(x) by log(10), but in IEEE Double format, we multiply * log(x) by [1/log(10)]. * * Special cases: * log10(x) is NaN with signal if x < 0; * log10(+INF) is +INF with no signal; log10(0) is -INF with signal; * log10(NaN) is that NaN with no signal. * * Accuracy: * log10(X) returns the exact log10(x) nearly rounded. In a test run * with 1,536,000 random arguments on a VAX, the maximum observed * error was 1.74 ulps (units in the last place). * * Constants: * The hexadecimal values are the intended ones for the following constants. * The decimal values may be used, provided that the compiler will convert * from decimal to binary accurately enough to produce the hexadecimal values * shown. */#include <errno.h>#include <limits.h>#ifdef VAX /* VAX D format (56 bits) *//* static double *//* ln10hi = 2.3025850929940456790E0 ; Hex 2^ 2 * .935D8DDDAAA8AC */static long ln10hix[] = { 0x5d8d4113, 0xa8acddaa};#define ln10hi (*(double*)ln10hix)#else /* IEEE double */static doubleivln10 = 4.3429448190325181667E-1 ; /*Hex 2^ -2 * 1.BCB7B1526E50E */#endifdouble log10(x)double x;{ double log(); if (x > 0.0)#ifdef VAX return(log(x)/ln10hi);#else /* IEEE double */ return(ivln10*log(x));#endif else { if (x < 0.0) errno = EDOM; else errno = ERANGE; return (-HUGE_VAL); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -