1
1
#include <math.h>
2
+ #include <float.h>
2
3
#include "common.h"
3
4
#ifdef FUNCTION_PROFILE
4
5
#include "functable.h"
5
6
#endif
6
7
8
+
7
9
#ifndef CBLAS
8
10
9
11
void NAME (FLOAT * DA , FLOAT * DB , FLOAT * C , FLOAT * S ){
@@ -14,35 +16,53 @@ void CNAME(FLOAT *DA, FLOAT *DB, FLOAT *C, FLOAT *S){
14
16
15
17
#endif
16
18
19
+ #ifdef DOUBLE
20
+ long double safmin = DBL_MIN ;
21
+ #else
22
+ long double safmin = FLT_MIN ;
23
+ #endif
24
+
17
25
#if defined(__i386__ ) || defined(__x86_64__ ) || defined(__ia64__ ) || defined(_M_X64 ) || defined(_M_IX86 )
18
26
19
27
long double da = * DA ;
20
28
long double db = * DB ;
21
29
long double c ;
22
30
long double s ;
23
- long double r , roe , z ;
31
+ long double r , z ;
32
+ long double sigma , dascal ,dbscal ;
24
33
25
34
long double ada = fabsl (da );
26
35
long double adb = fabsl (db );
27
- long double scale = ada + adb ;
36
+ long double maxab = MAX (ada ,adb );
37
+ long double safmax ;
38
+ long double scale ;
39
+
28
40
29
41
#ifndef CBLAS
30
42
PRINT_DEBUG_NAME ;
31
43
#else
32
44
PRINT_DEBUG_CNAME ;
33
45
#endif
34
46
35
- roe = db ;
36
- if (ada > adb ) roe = da ;
37
-
38
- if (scale == ZERO ) {
47
+ if (adb == ZERO ) {
39
48
* C = ONE ;
40
49
* S = ZERO ;
41
- * DA = ZERO ;
42
50
* DB = ZERO ;
51
+ } else if (ada == ZERO ) {
52
+ * C = ZERO ;
53
+ * S = ONE ;
54
+ * DA = * DB ;
55
+ * DB = ONE ;
43
56
} else {
44
- r = sqrt (da * da + db * db );
45
- if (roe < 0 ) r = - r ;
57
+ safmax = 1. /safmin ;
58
+ scale = MIN (MAX (safmin ,maxab ), safmax );
59
+ if (ada > adb )
60
+ sigma = copysign (1. ,da );
61
+ else
62
+ sigma = copysign (1. ,db );
63
+ dascal = da / scale ;
64
+ dbscal = db / scale ;
65
+ r = sigma * (scale * sqrt (dascal * dascal + dbscal * dbscal ));
46
66
c = da / r ;
47
67
s = db / r ;
48
68
z = ONE ;
@@ -65,32 +85,44 @@ void CNAME(FLOAT *DA, FLOAT *DB, FLOAT *C, FLOAT *S){
65
85
FLOAT db = * DB ;
66
86
FLOAT c = * C ;
67
87
FLOAT s = * S ;
68
- FLOAT r , roe , z ;
88
+ FLOAT sigma ;
89
+ FLOAT r , z ;
69
90
70
91
FLOAT ada = fabs (da );
71
92
FLOAT adb = fabs (db );
72
- FLOAT scale = ada + adb ;
93
+ FLOAT maxab = MAX (ada ,adb );
94
+ long double safmax ;
95
+ FLOAT scale ;
96
+
97
+ safmax = 1. /safmin ;
98
+ scale = MIN (MAX (safmin ,maxab ), safmax );
99
+
100
+ if (ada > adb )
101
+ sigma = copysign (1. ,da );
102
+ else
103
+ sigma = copysign (1. ,db );
73
104
74
105
#ifndef CBLAS
75
106
PRINT_DEBUG_NAME ;
76
107
#else
77
108
PRINT_DEBUG_CNAME ;
78
109
#endif
79
110
80
- roe = db ;
81
- if (ada > adb ) roe = da ;
82
111
83
- if (scale == ZERO ) {
112
+ if (adb == ZERO ) {
84
113
* C = ONE ;
85
114
* S = ZERO ;
86
- * DA = ZERO ;
87
115
* DB = ZERO ;
116
+ } else if (ada == ZERO ) {
117
+ * C = ZERO ;
118
+ * S = ONE ;
119
+ * DA = * DB ;
120
+ * DB = ONE ;
88
121
} else {
89
122
FLOAT aa = da / scale ;
90
123
FLOAT bb = db / scale ;
91
124
92
- r = scale * sqrt (aa * aa + bb * bb );
93
- if (roe < 0 ) r = - r ;
125
+ r = sigma * scale * sqrt (aa * aa + bb * bb );
94
126
c = da / r ;
95
127
s = db / r ;
96
128
z = ONE ;
0 commit comments