/* * The Spar Library - modular math parser * Copyright (C) 2000,2001 Davide Angelocola * * This 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. * * This 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 this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #include #include #include sl_complex sl_complex_sqrt (sl_complex z) { register double r; r = sl_complex_abs (z); r = sl_sqrt ((r + sl_abs (SL_COMPLEX_RE (z)) * sl_pow (2., -1))); if (SL_IS_ZERO (r)) { SL_COMPLEX_RE (z) = SL_COMPLEX_RE (z) = ZERO; } else { if (SL_IS_NOT_NEGATIVE (SL_COMPLEX_RE (z))) { SL_COMPLEX_RE (z) = r; SL_COMPLEX_IM (z) = (SL_COMPLEX_IM (z) / r) * sl_pow (2., -1); } else { SL_COMPLEX_RE (z) = (sl_abs (SL_COMPLEX_IM (z) / r)) * sl_pow (2., -1); if (SL_IS_NOT_NEGATIVE (SL_COMPLEX_IM (z))) { SL_COMPLEX_IM (z) = r; } else { SL_COMPLEX_IM (z) = -r; } } } return z; }