|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include <math.h>
- #include "common.h"
- #ifdef FUNCTION_PROFILE
- #include "functable.h"
- #endif
-
- #ifndef CBLAS
-
- void NAME(FLOAT *DA, FLOAT *DB, FLOAT *C, FLOAT *S){
-
- #else
-
- void CNAME(FLOAT *DA, FLOAT *DB, FLOAT *C, FLOAT *S){
-
- #endif
-
- #if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || defined(_M_X64) || defined(_M_IX86)
-
- long double da = *DA;
- long double db = *DB;
- long double c;
- long double s;
- long double r, roe, z;
-
- long double ada = fabsl(da);
- long double adb = fabsl(db);
- long double scale = ada + adb;
-
- #ifndef CBLAS
- PRINT_DEBUG_NAME;
- #else
- PRINT_DEBUG_CNAME;
- #endif
-
- roe = db;
- if (ada > adb) roe = da;
-
- if (scale == ZERO) {
- *C = ONE;
- *S = ZERO;
- *DA = ZERO;
- *DB = ZERO;
- } else {
- r = sqrt(da * da + db * db);
- if (roe < 0) r = -r;
- c = da / r;
- s = db / r;
- z = ONE;
- if (da != ZERO) {
- if (ada > adb){
- z = s;
- } else {
- z = ONE / c;
- }
- }
-
- *C = c;
- *S = s;
- *DA = r;
- *DB = z;
- }
-
- #else
- FLOAT da = *DA;
- FLOAT db = *DB;
- FLOAT c = *C;
- FLOAT s = *S;
- FLOAT r, roe, z;
-
- FLOAT ada = fabs(da);
- FLOAT adb = fabs(db);
- FLOAT scale = ada + adb;
-
- #ifndef CBLAS
- PRINT_DEBUG_NAME;
- #else
- PRINT_DEBUG_CNAME;
- #endif
-
- roe = db;
- if (ada > adb) roe = da;
-
- if (scale == ZERO) {
- *C = ONE;
- *S = ZERO;
- *DA = ZERO;
- *DB = ZERO;
- } else {
- FLOAT aa = da / scale;
- FLOAT bb = db / scale;
-
- r = scale * sqrt(aa * aa + bb * bb);
- if (roe < 0) r = -r;
- c = da / r;
- s = db / r;
- z = ONE;
- if (ada > adb) z = s;
- if ((ada <= adb) && (c != ZERO)) z = ONE / c;
-
- *C = c;
- *S = s;
- *DA = r;
- *DB = z;
- }
- #endif
-
- return;
- }
|