You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

zrotg.c 2.7 kB

7 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include <math.h>
  2. #include "common.h"
  3. #ifdef FUNCTION_PROFILE
  4. #include "functable.h"
  5. #endif
  6. #ifndef CBLAS
  7. void NAME(FLOAT *DA, FLOAT *DB, FLOAT *C, FLOAT *S){
  8. #else
  9. void CNAME(void *VDA, void *VDB, FLOAT *C, void *VS) {
  10. FLOAT *DA = (FLOAT*) VDA;
  11. FLOAT *DB = (FLOAT*) VDB;
  12. FLOAT *S = (FLOAT*) VS;
  13. #endif /* CBLAS */
  14. #if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || defined(_M_X64) || defined(_M_IX86)
  15. long double da_r = *(DA + 0);
  16. long double da_i = *(DA + 1);
  17. long double db_r = *(DB + 0);
  18. long double db_i = *(DB + 1);
  19. long double r;
  20. long double ada = fabsl(da_r) + fabsl(da_i);
  21. PRINT_DEBUG_NAME;
  22. IDEBUG_START;
  23. FUNCTION_PROFILE_START();
  24. if (ada == ZERO) {
  25. *C = ZERO;
  26. *(S + 0) = ONE;
  27. *(S + 1) = ZERO;
  28. *(DA + 0) = db_r;
  29. *(DA + 1) = db_i;
  30. } else {
  31. long double alpha_r, alpha_i;
  32. ada = sqrt(da_r * da_r + da_i * da_i);
  33. r = sqrt(da_r * da_r + da_i * da_i + db_r * db_r + db_i * db_i);
  34. alpha_r = da_r / ada;
  35. alpha_i = da_i / ada;
  36. *(C + 0) = ada / r;
  37. *(S + 0) = (alpha_r * db_r + alpha_i *db_i) / r;
  38. *(S + 1) = (alpha_i * db_r - alpha_r *db_i) / r;
  39. *(DA + 0) = alpha_r * r;
  40. *(DA + 1) = alpha_i * r;
  41. }
  42. #else
  43. FLOAT da_r = *(DA + 0);
  44. FLOAT da_i = *(DA + 1);
  45. FLOAT db_r = *(DB + 0);
  46. FLOAT db_i = *(DB + 1);
  47. FLOAT r;
  48. FLOAT ada = fabs(da_r) + fabs(da_i);
  49. FLOAT adb;
  50. PRINT_DEBUG_NAME;
  51. IDEBUG_START;
  52. FUNCTION_PROFILE_START();
  53. if (ada == ZERO) {
  54. *C = ZERO;
  55. *(S + 0) = ONE;
  56. *(S + 1) = ZERO;
  57. *(DA + 0) = db_r;
  58. *(DA + 1) = db_i;
  59. } else {
  60. FLOAT scale;
  61. FLOAT aa_r, aa_i, bb_r, bb_i;
  62. FLOAT alpha_r, alpha_i;
  63. aa_r = fabs(da_r);
  64. aa_i = fabs(da_i);
  65. if (aa_i > aa_r) {
  66. aa_r = fabs(da_i);
  67. aa_i = fabs(da_r);
  68. }
  69. if (aa_r == ZERO) {
  70. ada = 0.;
  71. } else {
  72. scale = (aa_i / aa_r);
  73. ada = aa_r * sqrt(ONE + scale * scale);
  74. }
  75. bb_r = fabs(db_r);
  76. bb_i = fabs(db_i);
  77. if (bb_i > bb_r) {
  78. bb_r = fabs(bb_i);
  79. bb_i = fabs(bb_r);
  80. }
  81. if (bb_r == ZERO) {
  82. adb = 0.;
  83. } else {
  84. scale = (bb_i / bb_r);
  85. adb = bb_r * sqrt(ONE + scale * scale);
  86. }
  87. scale = ada + adb;
  88. aa_r = da_r / scale;
  89. aa_i = da_i / scale;
  90. bb_r = db_r / scale;
  91. bb_i = db_i / scale;
  92. r = scale * sqrt(aa_r * aa_r + aa_i * aa_i + bb_r * bb_r + bb_i * bb_i);
  93. alpha_r = da_r / ada;
  94. alpha_i = da_i / ada;
  95. *(C + 0) = ada / r;
  96. *(S + 0) = (alpha_r * db_r + alpha_i *db_i) / r;
  97. *(S + 1) = (alpha_i * db_r - alpha_r *db_i) / r;
  98. *(DA + 0) = alpha_r * r;
  99. *(DA + 1) = alpha_i * r;
  100. }
  101. #endif
  102. FUNCTION_PROFILE_END(4, 4, 4);
  103. IDEBUG_END;
  104. return;
  105. }