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.4 kB

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