mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	* math/multc3.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile [$(subdir) = math] (libm-routines): Add multc3, divtc3. * sysdeps/unix/sysv/linux/sparc/sparc32/fpu/Implies: New file. * sysdeps/sparc/sparc32/fpu/s_fabsl.c: Include math.h and math_ldbl_opt.h. (fabsl): Use long_double_symbol instead of weak_alias. * sysdeps/sparc/sparc32/fpu/s_fabs.c: Include math.h and math_ldbl_opt.h. [LONG_DOUBLE_COMPAT] (fabsl): Add compat_symbol. 2006-01-31 Martin Schwidefsky <schwidefsky@de.ibm.com> Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/s390/Implies: New file. * sysdeps/unix/sysv/linux/s390/fpu/Implies: New file. * sysdeps/unix/sysv/linux/s390/nldbl-abi.h: New file. * sysdeps/s390/fpu/bits/mathinline.h (signbitl, sqrtl): New inlines. * sysdeps/s390/bits/mathdef.h: New file. * sysdeps/s390/fpu/e_sqrtl.c: New file. * sysdeps/s390/s390-32/bits/wordsize.h (__LONG_DOUBLE_MATH_OPTIONAL, __NO_LONG_DOUBLE_MATH): Define. * sysdeps/s390/s390-64/bits/wordsize.h: Likewise. * sysdeps/s390/Implies: Add ieee754/ldbl-128. * sysdeps/s390/ldbl2mpn.c: File removed. * sysdeps/s390/fpu/libm-test-ulps: Updated. 2006-01-31 Roland McGrath <roland@redhat.com> * sysdeps/alpha/fpu/bits/mathdef.h: Moved to ... * sysdeps/alpha/bits/mathdef.h: ... here. * sysdeps/i386/fpu/bits/mathdef.h: Moved to ... * sysdeps/i386/bits/mathdef.h: ... here. * sysdeps/mips/fpu/bits/mathdef.h: Moved to ... * sysdeps/mips/bits/mathdef.h: ... here. * sysdeps/m68k/fpu/bits/mathdef.h: Moved to ... * sysdeps/m68k/bits/mathdef.h: ... here. * sysdeps/powerpc/fpu/bits/mathdef.h: Moved to ... * sysdeps/powerpc/bits/mathdef.h: ... here. * sysdeps/sparc/fpu/bits/mathdef.h: Moved to ... * sysdeps/sparc/bits/mathdef.h: ... here. * sysdeps/ia64/fpu/bits/mathdef.h: Moved to ... * sysdeps/ia64/bits/mathdef.h: ... here. * sysdeps/sh/sh4/fpu/bits/mathdef.h: Moved to ... * sysdeps/sh/sh4/bits/mathdef.h: ... here. * sysdeps/x86_64/fpu/bits/mathdef.h: Moved to ... * sysdeps/x86_64/bits/mathdef.h: ... here. 2006-01-31 Jakub Jelinek <jakub@redhat.com>
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Copyright (C) 2005, 2006 Free Software Foundation, Inc.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
   Contributed by Richard Henderson <rth@redhat.com>, 2005.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, write to the Free
 | 
						|
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | 
						|
   02111-1307 USA.  */
 | 
						|
 | 
						|
#include <stdbool.h>
 | 
						|
#include <math.h>
 | 
						|
#include <complex.h>
 | 
						|
 | 
						|
attribute_hidden
 | 
						|
long double _Complex
 | 
						|
__divtc3 (long double a, long double b, long double c, long double d)
 | 
						|
{
 | 
						|
  long double denom, ratio, x, y;
 | 
						|
 | 
						|
  /* ??? We can get better behavior from logarithmic scaling instead of
 | 
						|
     the division.  But that would mean starting to link libgcc against
 | 
						|
     libm.  We could implement something akin to ldexp/frexp as gcc builtins
 | 
						|
     fairly easily...  */
 | 
						|
  if (fabsl (c) < fabsl (d))
 | 
						|
    {
 | 
						|
      ratio = c / d;
 | 
						|
      denom = (c * ratio) + d;
 | 
						|
      x = ((a * ratio) + b) / denom;
 | 
						|
      y = ((b * ratio) - a) / denom;
 | 
						|
    }
 | 
						|
  else
 | 
						|
    {
 | 
						|
      ratio = d / c;
 | 
						|
      denom = (d * ratio) + c;
 | 
						|
      x = ((b * ratio) + a) / denom;
 | 
						|
      y = (b - (a * ratio)) / denom;
 | 
						|
    }
 | 
						|
 | 
						|
  /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
 | 
						|
     are nonzero/zero, infinite/finite, and finite/infinite.  */
 | 
						|
  if (isnan (x) && isnan (y))
 | 
						|
    {
 | 
						|
      if (denom == 0.0 && (!isnan (a) || !isnan (b)))
 | 
						|
	{
 | 
						|
	  x = __copysignl (INFINITY, c) * a;
 | 
						|
	  y = __copysignl (INFINITY, c) * b;
 | 
						|
	}
 | 
						|
      else if ((isinf (a) || isinf (b)) && isfinite (c) && isfinite (d))
 | 
						|
	{
 | 
						|
	  a = __copysignl (isinf (a) ? 1 : 0, a);
 | 
						|
	  b = __copysignl (isinf (b) ? 1 : 0, b);
 | 
						|
	  x = INFINITY * (a * c + b * d);
 | 
						|
	  y = INFINITY * (b * c - a * d);
 | 
						|
	}
 | 
						|
      else if ((isinf (c) || isinf (d)) && isfinite (a) && isfinite (b))
 | 
						|
	{
 | 
						|
	  c = __copysignl (isinf (c) ? 1 : 0, c);
 | 
						|
	  d = __copysignl (isinf (d) ? 1 : 0, d);
 | 
						|
	  x = 0.0 * (a * c + b * d);
 | 
						|
	  y = 0.0 * (b * c - a * d);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
  return x + I * y;
 | 
						|
}
 |