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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. PRINT_DEBUG_NAME;
  8. IDEBUG_START;
  9. FUNCTION_PROFILE_START();
  10. #if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
  11. long double da_r = *(DA + 0);
  12. long double da_i = *(DA + 1);
  13. long double db_r = *(DB + 0);
  14. long double db_i = *(DB + 1);
  15. long double r;
  16. long double ada = fabs(da_r) + fabs(da_i);
  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. if (ada == ZERO) {
  44. *C = ZERO;
  45. *(S + 0) = ONE;
  46. *(S + 1) = ZERO;
  47. *(DA + 0) = db_r;
  48. *(DA + 1) = db_i;
  49. } else {
  50. FLOAT scale;
  51. FLOAT aa_r, aa_i, bb_r, bb_i;
  52. FLOAT alpha_r, alpha_i;
  53. aa_r = fabs(da_r);
  54. aa_i = fabs(da_i);
  55. if (aa_i > aa_r) {
  56. aa_r = fabs(da_i);
  57. aa_i = fabs(da_r);
  58. }
  59. scale = (aa_i / aa_r);
  60. ada = aa_r * sqrt(ONE + scale * scale);
  61. bb_r = fabs(db_r);
  62. bb_i = fabs(db_i);
  63. if (bb_i > bb_r) {
  64. bb_r = fabs(bb_i);
  65. bb_i = fabs(bb_r);
  66. }
  67. scale = (bb_i / bb_r);
  68. adb = bb_r * sqrt(ONE + scale * scale);
  69. scale = ada + adb;
  70. aa_r = da_r / scale;
  71. aa_i = da_i / scale;
  72. bb_r = db_r / scale;
  73. bb_i = db_i / scale;
  74. r = scale * sqrt(aa_r * aa_r + aa_i * aa_i + bb_r * bb_r + bb_i * bb_i);
  75. alpha_r = da_r / ada;
  76. alpha_i = da_i / ada;
  77. *(C + 0) = ada / r;
  78. *(S + 0) = (alpha_r * db_r + alpha_i *db_i) / r;
  79. *(S + 1) = (alpha_i * db_r - alpha_r *db_i) / r;
  80. *(DA + 0) = alpha_r * r;
  81. *(DA + 1) = alpha_i * r;
  82. }
  83. #endif
  84. FUNCTION_PROFILE_END(4, 4, 4);
  85. IDEBUG_END;
  86. return;
  87. }