c_dd.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*
  2. * src/c_dd.cc
  3. *
  4. * This work was supported by the Director, Office of Science, Division
  5. * of Mathematical, Information, and Computational Sciences of the
  6. * U.S. Department of Energy under contract number DE-AC03-76SF00098.
  7. *
  8. * Copyright (c) 2000-2001
  9. *
  10. * Contains the C wrapper functions for double-double precision arithmetic.
  11. * This can be used from Fortran code.
  12. */
  13. #include <cstring>
  14. #include "config.h"
  15. #include <qd/dd_real.h>
  16. #include <qd/c_dd.h>
  17. #define TO_DOUBLE_PTR(a, ptr) ptr[0] = a.x[0]; ptr[1] = a.x[1];
  18. extern "C" {
  19. /* add */
  20. void c_dd_add(const double *a, const double *b, double *c) {
  21. dd_real cc;
  22. cc = dd_real(a) + dd_real(b);
  23. TO_DOUBLE_PTR(cc, c);
  24. }
  25. void c_dd_add_dd_d(const double *a, double b, double *c) {
  26. dd_real cc;
  27. cc = dd_real(a) + b;
  28. TO_DOUBLE_PTR(cc, c);
  29. }
  30. void c_dd_add_d_dd(double a, const double *b, double *c) {
  31. dd_real cc;
  32. cc = a + dd_real(b);
  33. TO_DOUBLE_PTR(cc, c);
  34. }
  35. /* sub */
  36. void c_dd_sub(const double *a, const double *b, double *c) {
  37. dd_real cc;
  38. cc = dd_real(a) - dd_real(b);
  39. TO_DOUBLE_PTR(cc, c);
  40. }
  41. void c_dd_sub_dd_d(const double *a, double b, double *c) {
  42. dd_real cc;
  43. cc = dd_real(a) - b;
  44. TO_DOUBLE_PTR(cc, c);
  45. }
  46. void c_dd_sub_d_dd(double a, const double *b, double *c) {
  47. dd_real cc;
  48. cc = a - dd_real(b);
  49. TO_DOUBLE_PTR(cc, c);
  50. }
  51. /* mul */
  52. void c_dd_mul(const double *a, const double *b, double *c) {
  53. dd_real cc;
  54. cc = dd_real(a) * dd_real(b);
  55. TO_DOUBLE_PTR(cc, c);
  56. }
  57. void c_dd_mul_dd_d(const double *a, double b, double *c) {
  58. dd_real cc;
  59. cc = dd_real(a) * b;
  60. TO_DOUBLE_PTR(cc, c);
  61. }
  62. void c_dd_mul_d_dd(double a, const double *b, double *c) {
  63. dd_real cc;
  64. cc = a * dd_real(b);
  65. TO_DOUBLE_PTR(cc, c);
  66. }
  67. /* div */
  68. void c_dd_div(const double *a, const double *b, double *c) {
  69. dd_real cc;
  70. cc = dd_real(a) / dd_real(b);
  71. TO_DOUBLE_PTR(cc, c);
  72. }
  73. void c_dd_div_dd_d(const double *a, double b, double *c) {
  74. dd_real cc;
  75. cc = dd_real(a) / b;
  76. TO_DOUBLE_PTR(cc, c);
  77. }
  78. void c_dd_div_d_dd(double a, const double *b, double *c) {
  79. dd_real cc;
  80. cc = a / dd_real(b);
  81. TO_DOUBLE_PTR(cc, c);
  82. }
  83. /* copy */
  84. void c_dd_copy(const double *a, double *b) {
  85. b[0] = a[0];
  86. b[1] = a[1];
  87. }
  88. void c_dd_copy_d(double a, double *b) {
  89. b[0] = a;
  90. b[1] = 0.0;
  91. }
  92. void c_dd_sqrt(const double *a, double *b) {
  93. dd_real bb;
  94. bb = sqrt(dd_real(a));
  95. TO_DOUBLE_PTR(bb, b);
  96. }
  97. void c_dd_sqr(const double *a, double *b) {
  98. dd_real bb;
  99. bb = sqr(dd_real(a));
  100. TO_DOUBLE_PTR(bb, b);
  101. }
  102. void c_dd_abs(const double *a, double *b) {
  103. dd_real bb;
  104. bb = abs(dd_real(a));
  105. TO_DOUBLE_PTR(bb, b);
  106. }
  107. void c_dd_npwr(const double *a, int n, double *b) {
  108. dd_real bb;
  109. bb = npwr(dd_real(a), n);
  110. TO_DOUBLE_PTR(bb, b);
  111. }
  112. void c_dd_nroot(const double *a, int n, double *b) {
  113. dd_real bb;
  114. bb = nroot(dd_real(a), n);
  115. TO_DOUBLE_PTR(bb, b);
  116. }
  117. void c_dd_nint(const double *a, double *b) {
  118. dd_real bb;
  119. bb = nint(dd_real(a));
  120. TO_DOUBLE_PTR(bb, b);
  121. }
  122. void c_dd_aint(const double *a, double *b) {
  123. dd_real bb;
  124. bb = aint(dd_real(a));
  125. TO_DOUBLE_PTR(bb, b);
  126. }
  127. void c_dd_floor(const double *a, double *b) {
  128. dd_real bb;
  129. bb = floor(dd_real(a));
  130. TO_DOUBLE_PTR(bb, b);
  131. }
  132. void c_dd_ceil(const double *a, double *b) {
  133. dd_real bb;
  134. bb = ceil(dd_real(a));
  135. TO_DOUBLE_PTR(bb, b);
  136. }
  137. void c_dd_log(const double *a, double *b) {
  138. dd_real bb;
  139. bb = log(dd_real(a));
  140. TO_DOUBLE_PTR(bb, b);
  141. }
  142. void c_dd_log10(const double *a, double *b) {
  143. dd_real bb;
  144. bb = log10(dd_real(a));
  145. TO_DOUBLE_PTR(bb, b);
  146. }
  147. void c_dd_exp(const double *a, double *b) {
  148. dd_real bb;
  149. bb = exp(dd_real(a));
  150. TO_DOUBLE_PTR(bb, b);
  151. }
  152. void c_dd_sin(const double *a, double *b) {
  153. dd_real bb;
  154. bb = sin(dd_real(a));
  155. TO_DOUBLE_PTR(bb, b);
  156. }
  157. void c_dd_cos(const double *a, double *b) {
  158. dd_real bb;
  159. bb = cos(dd_real(a));
  160. TO_DOUBLE_PTR(bb, b);
  161. }
  162. void c_dd_tan(const double *a, double *b) {
  163. dd_real bb;
  164. bb = tan(dd_real(a));
  165. TO_DOUBLE_PTR(bb, b);
  166. }
  167. void c_dd_asin(const double *a, double *b) {
  168. dd_real bb;
  169. bb = asin(dd_real(a));
  170. TO_DOUBLE_PTR(bb, b);
  171. }
  172. void c_dd_acos(const double *a, double *b) {
  173. dd_real bb;
  174. bb = acos(dd_real(a));
  175. TO_DOUBLE_PTR(bb, b);
  176. }
  177. void c_dd_atan(const double *a, double *b) {
  178. dd_real bb;
  179. bb = atan(dd_real(a));
  180. TO_DOUBLE_PTR(bb, b);
  181. }
  182. void c_dd_atan2(const double *a, const double *b, double *c) {
  183. dd_real cc;
  184. cc = atan2(dd_real(a), dd_real(b));
  185. TO_DOUBLE_PTR(cc, c);
  186. }
  187. void c_dd_sinh(const double *a, double *b) {
  188. dd_real bb;
  189. bb = sinh(dd_real(a));
  190. TO_DOUBLE_PTR(bb, b);
  191. }
  192. void c_dd_cosh(const double *a, double *b) {
  193. dd_real bb;
  194. bb = cosh(dd_real(a));
  195. TO_DOUBLE_PTR(bb, b);
  196. }
  197. void c_dd_tanh(const double *a, double *b) {
  198. dd_real bb;
  199. bb = tanh(dd_real(a));
  200. TO_DOUBLE_PTR(bb, b);
  201. }
  202. void c_dd_asinh(const double *a, double *b) {
  203. dd_real bb;
  204. bb = asinh(dd_real(a));
  205. TO_DOUBLE_PTR(bb, b);
  206. }
  207. void c_dd_acosh(const double *a, double *b) {
  208. dd_real bb;
  209. bb = acosh(dd_real(a));
  210. TO_DOUBLE_PTR(bb, b);
  211. }
  212. void c_dd_atanh(const double *a, double *b) {
  213. dd_real bb;
  214. bb = atanh(dd_real(a));
  215. TO_DOUBLE_PTR(bb, b);
  216. }
  217. void c_dd_sincos(const double *a, double *s, double *c) {
  218. dd_real ss, cc;
  219. sincos(dd_real(a), ss, cc);
  220. TO_DOUBLE_PTR(ss, s);
  221. TO_DOUBLE_PTR(cc, c);
  222. }
  223. void c_dd_sincosh(const double *a, double *s, double *c) {
  224. dd_real ss, cc;
  225. sincosh(dd_real(a), ss, cc);
  226. TO_DOUBLE_PTR(ss, s);
  227. TO_DOUBLE_PTR(cc, c);
  228. }
  229. void c_dd_read(const char *s, double *a) {
  230. dd_real aa(s);
  231. TO_DOUBLE_PTR(aa, a);
  232. }
  233. void c_dd_swrite(const double *a, int precision, char *s, int len) {
  234. dd_real(a).write(s, len, precision);
  235. }
  236. void c_dd_write(const double *a) {
  237. std::cout << dd_real(a).to_string(dd_real::_ndigits) << std::endl;
  238. }
  239. void c_dd_neg(const double *a, double *b) {
  240. b[0] = -a[0];
  241. b[1] = -a[1];
  242. }
  243. void c_dd_rand(double *a) {
  244. dd_real aa;
  245. aa = ddrand();
  246. TO_DOUBLE_PTR(aa, a);
  247. }
  248. void c_dd_comp(const double *a, const double *b, int *result) {
  249. dd_real aa(a), bb(b);
  250. if (aa < bb)
  251. *result = -1;
  252. else if (aa > bb)
  253. *result = 1;
  254. else
  255. *result = 0;
  256. }
  257. void c_dd_comp_dd_d(const double *a, double b, int *result) {
  258. dd_real aa(a), bb(b);
  259. if (aa < bb)
  260. *result = -1;
  261. else if (aa > bb)
  262. *result = 1;
  263. else
  264. *result = 0;
  265. }
  266. void c_dd_comp_d_dd(double a, const double *b, int *result) {
  267. dd_real aa(a), bb(b);
  268. if (aa < bb)
  269. *result = -1;
  270. else if (aa > bb)
  271. *result = 1;
  272. else
  273. *result = 0;
  274. }
  275. void c_dd_pi(double *a) {
  276. TO_DOUBLE_PTR(dd_real::_pi, a);
  277. }
  278. }