sp_sqrt.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* IEEE754 floating point arithmetic
  2.  * single precision square root
  3.  */
  4. /*
  5.  * MIPS floating point support
  6.  * Copyright (C) 1994-2000 Algorithmics Ltd.  All rights reserved.
  7.  * http://www.algor.co.uk
  8.  *
  9.  * ########################################################################
  10.  *
  11.  *  This program is free software; you can distribute it and/or modify it
  12.  *  under the terms of the GNU General Public License (Version 2) as
  13.  *  published by the Free Software Foundation.
  14.  *
  15.  *  This program is distributed in the hope it will be useful, but WITHOUT
  16.  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17.  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  18.  *  for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License along
  21.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  22.  *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
  23.  *
  24.  * ########################################################################
  25.  */
  26. #include "ieee754sp.h"
  27. static const struct ieee754sp_konst knan = {
  28. 0, SP_EBIAS + SP_EMAX + 1, 0
  29. };
  30. #define nan ((ieee754sp)knan)
  31. ieee754sp ieee754sp_sqrt(ieee754sp x)
  32. {
  33. int sign = (int) 0x80000000;
  34. int ix, s, q, m, t, i;
  35. unsigned int r;
  36. COMPXDP;
  37. /* take care of Inf and NaN */
  38. EXPLODEXDP;
  39. /* x == INF or NAN? */
  40. switch (xc) {
  41. case IEEE754_CLASS_QNAN:
  42. case IEEE754_CLASS_SNAN:
  43. /* sqrt(Nan) = Nan */
  44. return ieee754sp_nanxcpt(x, "sqrt");
  45. case IEEE754_CLASS_ZERO:
  46. /* sqrt(0) = 0 */
  47. return x;
  48. case IEEE754_CLASS_INF:
  49. if (xs)
  50. /* sqrt(-Inf) = Nan */
  51. return ieee754sp_nanxcpt(nan, "sqrt");
  52. /* sqrt(+Inf) = Inf */
  53. return x;
  54. case IEEE754_CLASS_DNORM:
  55. case IEEE754_CLASS_NORM:
  56. if (xs)
  57. /* sqrt(-x) = Nan */
  58. return ieee754sp_nanxcpt(nan, "sqrt");
  59. break;
  60. }
  61. ix = x.bits;
  62. /* normalize x */
  63. m = (ix >> 23);
  64. if (m == 0) { /* subnormal x */
  65. for (i = 0; (ix & 0x00800000) == 0; i++)
  66. ix <<= 1;
  67. m -= i - 1;
  68. }
  69. m -= 127; /* unbias exponent */
  70. ix = (ix & 0x007fffff) | 0x00800000;
  71. if (m & 1) /* odd m, double x to make it even */
  72. ix += ix;
  73. m >>= 1; /* m = [m/2] */
  74. /* generate sqrt(x) bit by bit */
  75. ix += ix;
  76. q = s = 0; /* q = sqrt(x) */
  77. r = 0x01000000; /* r = moving bit from right to left */
  78. while (r != 0) {
  79. t = s + r;
  80. if (t <= ix) {
  81. s = t + r;
  82. ix -= t;
  83. q += r;
  84. }
  85. ix += ix;
  86. r >>= 1;
  87. }
  88. if (ix != 0) {
  89. switch (ieee754_csr.rm) {
  90. case IEEE754_RP:
  91. q += 2;
  92. break;
  93. case IEEE754_RN:
  94. q += (q & 1);
  95. break;
  96. }
  97. }
  98. ix = (q >> 1) + 0x3f000000;
  99. ix += (m << 23);
  100. x.bits = ix;
  101. return x;
  102. }