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.

rotmg.c 3.0 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "common.h"
  2. #ifdef FUNCTION_PROFILE
  3. #include "functable.h"
  4. #endif
  5. #define GAM 4096.e0
  6. #define GAMSQ 16777216.e0
  7. #define RGAMSQ 5.9604645e-8
  8. #ifdef DOUBLE
  9. #define ABS(x) fabs(x)
  10. #else
  11. #define ABS(x) fabsf(x)
  12. #endif
  13. #ifndef CBLAS
  14. void NAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT *DY1, FLOAT *dparam){
  15. FLOAT dy1 = *DY1;
  16. #else
  17. void CNAME(FLOAT *dd1, FLOAT *dd2, FLOAT *dx1, FLOAT dy1, FLOAT *dparam){
  18. #endif
  19. FLOAT du, dp1, dp2, dq2, dq1, dh11, dh21, dh12, dh22;
  20. int igo, flag;
  21. FLOAT dtemp;
  22. #ifndef CBLAS
  23. PRINT_DEBUG_NAME;
  24. #else
  25. PRINT_DEBUG_CNAME;
  26. #endif
  27. dh11 = ZERO;
  28. dh12 = ZERO;
  29. dh21 = ZERO;
  30. dh22 = ZERO;
  31. if (*dd1 < ZERO) goto L60;
  32. dp2 = *dd2 * dy1;
  33. if (dp2 == ZERO) {
  34. flag = -2;
  35. goto L260;
  36. }
  37. dp1 = *dd1 * *dx1;
  38. dq2 = dp2 * dy1;
  39. dq1 = dp1 * *dx1;
  40. if (! (ABS(dq1) > ABS(dq2))) goto L40;
  41. dh21 = -(dy1) / *dx1;
  42. dh12 = dp2 / dp1;
  43. du = ONE - dh12 * dh21;
  44. if (du <= ZERO) goto L60;
  45. flag = 0;
  46. *dd1 /= du;
  47. *dd2 /= du;
  48. *dx1 *= du;
  49. goto L100;
  50. L40:
  51. if (dq2 < ZERO) goto L60;
  52. flag = 1;
  53. dh11 = dp1 / dp2;
  54. dh22 = *dx1 / dy1;
  55. du = ONE + dh11 * dh22;
  56. dtemp = *dd2 / du;
  57. *dd2 = *dd1 / du;
  58. *dd1 = dtemp;
  59. *dx1 = dy1 * du;
  60. goto L100;
  61. L60:
  62. flag = -1;
  63. dh11 = ZERO;
  64. dh12 = ZERO;
  65. dh21 = ZERO;
  66. dh22 = ZERO;
  67. *dd1 = ZERO;
  68. *dd2 = ZERO;
  69. *dx1 = ZERO;
  70. goto L220;
  71. L70:
  72. if (flag < 0) goto L90;
  73. if (flag > 0) goto L80;
  74. dh11 = ONE;
  75. dh22 = ONE;
  76. flag = -1;
  77. goto L90;
  78. L80:
  79. dh21 = -ONE;
  80. dh12 = ONE;
  81. flag = -1;
  82. L90:
  83. switch (igo) {
  84. case 0: goto L120;
  85. case 1: goto L150;
  86. case 2: goto L180;
  87. case 3: goto L210;
  88. }
  89. L100:
  90. if (!(*dd1 <= RGAMSQ)) goto L130;
  91. if (*dd1 == ZERO) goto L160;
  92. igo = 0;
  93. goto L70;
  94. L120:
  95. *dd1 *= GAM * GAM;
  96. *dx1 /= GAM;
  97. dh11 /= GAM;
  98. dh12 /= GAM;
  99. goto L100;
  100. L130:
  101. if (! (*dd1 >= GAMSQ)) {
  102. goto L160;
  103. }
  104. igo = 1;
  105. goto L70;
  106. L150:
  107. *dd1 /= GAM * GAM;
  108. *dx1 *= GAM;
  109. dh11 *= GAM;
  110. dh12 *= GAM;
  111. goto L130;
  112. L160:
  113. if (! (ABS(*dd2) <= RGAMSQ)) {
  114. goto L190;
  115. }
  116. if (*dd2 == ZERO) {
  117. goto L220;
  118. }
  119. igo = 2;
  120. goto L70;
  121. L180:
  122. /* Computing 2nd power */
  123. *dd2 *= GAM * GAM;
  124. dh21 /= GAM;
  125. dh22 /= GAM;
  126. goto L160;
  127. L190:
  128. if (! (ABS(*dd2) >= GAMSQ)) {
  129. goto L220;
  130. }
  131. igo = 3;
  132. goto L70;
  133. L210:
  134. /* Computing 2nd power */
  135. *dd2 /= GAM * GAM;
  136. dh21 *= GAM;
  137. dh22 *= GAM;
  138. goto L190;
  139. L220:
  140. if (flag < 0) {
  141. goto L250;
  142. } else if (flag == 0) {
  143. goto L230;
  144. } else {
  145. goto L240;
  146. }
  147. L230:
  148. dparam[2] = dh21;
  149. dparam[3] = dh12;
  150. goto L260;
  151. L240:
  152. dparam[2] = dh11;
  153. dparam[4] = dh22;
  154. goto L260;
  155. L250:
  156. dparam[1] = dh11;
  157. dparam[2] = dh21;
  158. dparam[3] = dh12;
  159. dparam[4] = dh22;
  160. L260:
  161. dparam[0] = (FLOAT) flag;
  162. return;
  163. }