Ejemplo n.º 1
0
/*
 * _CHABS:  complex(kind=4) absolute value, returns real(kind=4) value
 *        - pass by value
 */
_f_real4

#ifdef _CRAYMPP
_CHABS(_f_comp4 z)
{
	union hl_complx4 {
		_f_comp4	cpx4;
		struct {
			_f_real4	real;
			_f_real4	imag;
		} rlim4;
	} f;
	_f_real4 ret_val;
	_f_real8 _SQRT(_f_real8 x);
	_f_real8 real, imag;
	f.cpx4	= z;
	real = fabs((_f_real8) f.rlim4.real);
	imag = fabs((_f_real8) f.rlim4.imag);
	if (real == 0.0 && imag == 0.0) return((_f_real4) 0.0);
	if (real > imag)
		ret_val =
		 (_f_real4) (real * _SQRT((_f_real8) 1.0 +
				 (imag/real) * (imag/real)));
	else
		ret_val =
		 (_f_real4) (imag * _SQRT((_f_real8) 1.0 +
				 (real/imag) * (real/imag)));
#else
_CHABS(h_complex_t z)
{
	_f_real8 __fabs(_f_real8 x);
	_f_real8 __sqrt(_f_real8 x);
	_f_real8 real = __fabs((_f_real8) z.real);
	_f_real8 imag = __fabs((_f_real8) z.imag);
	_f_real4 ret_val;
	if (real == 0.0 && imag == 0.0) return((_f_real4) 0.0);
	if (real > imag)
		ret_val =
		 (_f_real4) (real * __sqrt((_f_real8) 1.0 +
				 (imag/real) * (imag/real)));
	else
		ret_val =
		 (_f_real4) (imag * __sqrt((_f_real8) 1.0 +
				 (real/imag) * (real/imag)));
#endif
	return (ret_val);
}
Ejemplo n.º 2
0
/*
 * SQRT: real(kind=8) - pass by address
 */
_f_real8
_SQRT_( _f_real8 *x )
{
	_f_real8 __sqrt(_f_real8 x);
	return ((_f_real8) __sqrt((_f_real8) *x));
}
Ejemplo n.º 3
0
REAL inverse_cholesky(const REAL in[N][N], REAL out[N][N])
{
  /* extract upper triangle from the [symmetric] input matrix */

  for (int j = 0; j < N; j++)
    for (int i = j; i < N; i++)
      out[j][i] = out[i][j] = in[j][i];

  /* Cholesky factorization, stored in the lower triangle */

  for (int k = 0; k < N; k++)
  {
    if (out[k][k] <= 0) return REAL(0.0);  /* matrix is not positive definite, return 0 */
    out[k][k] = __sqrt(out[k][k]);
    const REAL ainv = REAL(1.0)/out[k][k];
    for (int i = k+1; i < N; i++)
      out[i][k] *= ainv;
    for (int j = k+1; j < N; j++)
      for (int i = j; i < N; i++)
        out[i][j] -= out[i][k]*out[j][k];
  }

  for (int j = 0; j < N; j++)
    for (int i = j+1; i < N; i++)
      out[j][i] = 0.0;
  
  /* determinant */
  
  REAL det = 1.0;
  for (int i = 0; i < N; i++)
    det *= out[i][i];
  det *= det;
  assert(det > 0.0);

  /* invert lower triangular matrix */

  for (int k = 0; k < N; k++)
    out[k][k] = REAL(1.0)/out[k][k];

  for (int i = 1; i < N; i++)
    for (int j = 0; j < i; j++)
    {
      REAL sum = 0.0;
      for (int k = j; k < i; k++)
        sum += out[i][k] * out[k][j];
      out[i][j] = -out[i][i]*sum;
    }

  /* compute inverse by multiplying inverse of L and its transpose */

  for (int j = 0; j < N; j++)
    for (int i = j; i < N; i++)
    {
      REAL sum = 0;
      for (int k = i; k < N; k++)
        sum += out[k][j]*out[k][i];
      out[j][i] = sum;
    }

  for (int j = 0; j < N; j++)
    for (int i = j+1; i < N; i++)
      out[i][j] = out[j][i];

  return det;
}
Ejemplo n.º 4
0
/*
 * HSQRT: real(kind=4) - pass by address
 */
_f_real4
_HSQRT_( _f_real4 *x )
{
	_f_real8 __sqrt(_f_real8 x);
	return ((_f_real4) __sqrt((_f_real8) *x));
}
Ejemplo n.º 5
0
double _sqrt(double x) {
    return __sqrt(x);
}