cnrm2_ssq1_x0.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 82 行
C
82 行
#include "atlas_misc.h"#include <math.h>static void SSQ(const int N, const TYPE *X, const int incX0, TYPE *scal0, TYPE *ssq0){ const int incX = incX0+incX0; TYPE t0, ar, ai, ssq=(*ssq0), scal=(*scal0); const TYPE *stX = X + N*incX; if (scal == ATL_rzero) /* need to start ops */ { while (X != stX && *X == ATL_rzero && X[1] == ATL_rzero) X += incX; if (X != stX) { ar = fabs(*X); ai = fabs(X[1]); if (ar != ATL_rzero && ai != ATL_rzero) { if (ar < ai) { t0 = ai; ai = ar; ar = t0; } t0 = ai / ar; scal = ar; ssq = ATL_rone + t0*t0; } else if (ai == ATL_rzero) { scal = ar; ssq = ATL_rone; } else { scal = ai; ssq = ATL_rone; } X += incX; } else return; } if (X != stX) { do { ar = fabs(*X); ai = fabs(X[1]); X += incX; if (scal >= ar && scal >= ai) { ar /= scal; ssq += ar*ar; ai /= scal; ssq += ai*ai; } else if (ar >= ai) { t0 = scal / ar; t0 *= t0; ssq = ATL_rone + ssq * t0; scal = ar; ai /= ar; ssq += ai * ai; } else { t0 = scal / ai; t0 *= t0; ssq = ATL_rone + ssq * t0; scal = ai; ar /= ai; ssq += ar * ar; } } while (X != stX); } *ssq0 = ssq; *scal0 = scal;}TYPE ATL_UNRM2(const int N, const TYPE *X, const int incX){ TYPE ssq=ATL_rone, scal=ATL_rzero; SSQ(N, X, incX, &scal, &ssq); return(scal * sqrt(ssq));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?