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.

f2c.c 2.1 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "signal.h"
  4. #include "f2c.h"
  5. #ifndef SIGIOT
  6. #ifdef SIGABRT
  7. #define SIGIOT SIGABRT
  8. #endif
  9. #endif
  10. void sig_die(const char *s, blasint kill) {
  11. /* print error message, then clear buffers */
  12. fprintf(stderr, "%s\n", s);
  13. if(kill) {
  14. fflush(stderr);
  15. /* now get a core */
  16. signal(SIGIOT, SIG_DFL);
  17. abort();
  18. } else
  19. exit(1);
  20. }
  21. void c_div(complex *c, complex *a, complex *b) {
  22. double ratio, den;
  23. double abr, abi, cr;
  24. if( (abr = b->r) < 0.)
  25. abr = - abr;
  26. if( (abi = b->i) < 0.)
  27. abi = - abi;
  28. if( abr <= abi ) {
  29. if(abi == 0) {
  30. #ifdef IEEE_COMPLEX_DIVIDE
  31. float af, bf;
  32. af = bf = abr;
  33. if (a->i != 0 || a->r != 0)
  34. af = 1.;
  35. c->i = c->r = af / bf;
  36. return;
  37. #else
  38. sig_die("complex division by zero", 1);
  39. #endif
  40. }
  41. ratio = (double)b->r / b->i ;
  42. den = b->i * (1 + ratio*ratio);
  43. cr = (a->r*ratio + a->i) / den;
  44. c->i = (a->i*ratio - a->r) / den;
  45. } else {
  46. ratio = (double)b->i / b->r ;
  47. den = b->r * (1 + ratio*ratio);
  48. cr = (a->r + a->i*ratio) / den;
  49. c->i = (a->i - a->r*ratio) / den;
  50. }
  51. c->r = cr;
  52. }
  53. void z_div(doublecomplex *c, doublecomplex *a, doublecomplex *b) {
  54. double ratio, den;
  55. double abr, abi, cr;
  56. if( (abr = b->r) < 0.)
  57. abr = - abr;
  58. if( (abi = b->i) < 0.)
  59. abi = - abi;
  60. if( abr <= abi ) {
  61. if(abi == 0) {
  62. #ifdef IEEE_COMPLEX_DIVIDE
  63. if (a->i != 0 || a->r != 0)
  64. abi = 1.;
  65. c->i = c->r = abi / abr;
  66. return;
  67. #else
  68. sig_die("complex division by zero", 1);
  69. #endif
  70. }
  71. ratio = b->r / b->i ;
  72. den = b->i * (1 + ratio*ratio);
  73. cr = (a->r*ratio + a->i) / den;
  74. c->i = (a->i*ratio - a->r) / den;
  75. } else {
  76. ratio = b->i / b->r ;
  77. den = b->r * (1 + ratio*ratio);
  78. cr = (a->r + a->i*ratio) / den;
  79. c->i = (a->i - a->r*ratio) / den;
  80. }
  81. c->r = cr;
  82. }
  83. float r_imag(complex *z) {
  84. return z->i;
  85. }
  86. void r_cnjg(complex *r, complex *z) {
  87. float zi = z->i;
  88. r->r = z->r;
  89. r->i = -zi;
  90. }
  91. double d_imag(doublecomplex *z) {
  92. return z->i;
  93. }
  94. void d_cnjg(doublecomplex *r, doublecomplex *z) {
  95. double zi = z->i;
  96. r->r = z->r;
  97. r->i = -zi;
  98. }