1 | /* mpc.h -- Include file for mpc. |
---|---|

2 | |

3 | Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2014, 2015 INRIA |

4 | |

5 | This file is part of GNU MPC. |

6 | |

7 | GNU MPC is free software; you can redistribute it and/or modify it under |

8 | the terms of the GNU Lesser General Public License as published by the |

9 | Free Software Foundation; either version 3 of the License, or (at your |

10 | option) any later version. |

11 | |

12 | GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY |

13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |

14 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for |

15 | more details. |

16 | |

17 | You should have received a copy of the GNU Lesser General Public License |

18 | along with this program. If not, see http://www.gnu.org/licenses/ . |

19 | */ |

20 | |

21 | #ifndef __MPC_H |

22 | #define __MPC_H |

23 | |

24 | #include "gmp.h" |

25 | #include "mpfr.h" |

26 | |

27 | /* Backwards compatibility with mpfr<3.0.0 */ |

28 | #ifndef mpfr_exp_t |

29 | #define mpfr_exp_t mp_exp_t |

30 | #endif |

31 | |

32 | /* Define MPC version number */ |

33 | #define MPC_VERSION_MAJOR 1 |

34 | #define MPC_VERSION_MINOR 0 |

35 | #define MPC_VERSION_PATCHLEVEL 3 |

36 | #define MPC_VERSION_STRING "1.0.3" |

37 | |

38 | /* Macros dealing with MPC VERSION */ |

39 | #define MPC_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) |

40 | #define MPC_VERSION \ |

41 | MPC_VERSION_NUM(MPC_VERSION_MAJOR,MPC_VERSION_MINOR,MPC_VERSION_PATCHLEVEL) |

42 | |

43 | /* Check if stdint.h/inttypes.h is included */ |

44 | #if defined (INTMAX_C) && defined (UINTMAX_C) |

45 | #define _MPC_H_HAVE_INTMAX_T 1 |

46 | #endif |

47 | |

48 | /* Return values */ |

49 | |

50 | /* Transform negative to 2, positive to 1, leave 0 unchanged */ |

51 | #define MPC_INEX_POS(inex) (((inex) < 0) ? 2 : ((inex) == 0) ? 0 : 1) |

52 | /* Transform 2 to negative, 1 to positive, leave 0 unchanged */ |

53 | #define MPC_INEX_NEG(inex) (((inex) == 2) ? -1 : ((inex) == 0) ? 0 : 1) |

54 | |

55 | /* The global inexact flag is made of (real flag) + 4 * (imaginary flag), where |

56 | each of the real and imaginary inexact flag are: |

57 | 0 when the result is exact (no rounding error) |

58 | 1 when the result is larger than the exact value |

59 | 2 when the result is smaller than the exact value */ |

60 | #define MPC_INEX(inex_re, inex_im) \ |

61 | (MPC_INEX_POS(inex_re) | (MPC_INEX_POS(inex_im) << 2)) |

62 | #define MPC_INEX_RE(inex) MPC_INEX_NEG((inex) & 3) |

63 | #define MPC_INEX_IM(inex) MPC_INEX_NEG((inex) >> 2) |

64 | |

65 | /* For functions computing two results, the return value is |

66 | inexact1+16*inexact2, which is 0 iif both results are exact. */ |

67 | #define MPC_INEX12(inex1, inex2) (inex1 | (inex2 << 4)) |

68 | #define MPC_INEX1(inex) (inex & 15) |

69 | #define MPC_INEX2(inex) (inex >> 4) |

70 | |

71 | /* Definition of rounding modes */ |

72 | |

73 | /* a complex rounding mode is just a pair of two real rounding modes |

74 | we reserve four bits for a real rounding mode. */ |

75 | typedef int mpc_rnd_t; |

76 | |

77 | #define MPC_RND(r1,r2) (((int)(r1)) + ((int)(r2) << 4)) |

78 | #define MPC_RND_RE(x) ((mpfr_rnd_t)((x) & 0x0F)) |

79 | #define MPC_RND_IM(x) ((mpfr_rnd_t)((x) >> 4)) |

80 | |

81 | #define MPC_RNDNN MPC_RND (GMP_RNDN,GMP_RNDN) |

82 | #define MPC_RNDNZ MPC_RND (GMP_RNDN,GMP_RNDZ) |

83 | #define MPC_RNDNU MPC_RND (GMP_RNDN,GMP_RNDU) |

84 | #define MPC_RNDND MPC_RND (GMP_RNDN,GMP_RNDD) |

85 | |

86 | #define MPC_RNDZN MPC_RND (GMP_RNDZ,GMP_RNDN) |

87 | #define MPC_RNDZZ MPC_RND (GMP_RNDZ,GMP_RNDZ) |

88 | #define MPC_RNDZU MPC_RND (GMP_RNDZ,GMP_RNDU) |

89 | #define MPC_RNDZD MPC_RND (GMP_RNDZ,GMP_RNDD) |

90 | |

91 | #define MPC_RNDUN MPC_RND (GMP_RNDU,GMP_RNDN) |

92 | #define MPC_RNDUZ MPC_RND (GMP_RNDU,GMP_RNDZ) |

93 | #define MPC_RNDUU MPC_RND (GMP_RNDU,GMP_RNDU) |

94 | #define MPC_RNDUD MPC_RND (GMP_RNDU,GMP_RNDD) |

95 | |

96 | #define MPC_RNDDN MPC_RND (GMP_RNDD,GMP_RNDN) |

97 | #define MPC_RNDDZ MPC_RND (GMP_RNDD,GMP_RNDZ) |

98 | #define MPC_RNDDU MPC_RND (GMP_RNDD,GMP_RNDU) |

99 | #define MPC_RNDDD MPC_RND (GMP_RNDD,GMP_RNDD) |

100 | |

101 | |

102 | /* Definitions of types and their semantics */ |

103 | |

104 | typedef struct { |

105 | mpfr_t re; |

106 | mpfr_t im; |

107 | } |

108 | __mpc_struct; |

109 | |

110 | typedef __mpc_struct mpc_t[1]; |

111 | typedef __mpc_struct *mpc_ptr; |

112 | typedef const __mpc_struct *mpc_srcptr; |

113 | |

114 | /* Support for WINDOWS DLL, see |

115 | http://lists.gforge.inria.fr/pipermail/mpc-discuss/2011-November/000990.html; |

116 | when building the DLL, export symbols, otherwise behave as GMP */ |

117 | #if defined (__MPC_LIBRARY_BUILD) && __GMP_LIBGMP_DLL |

118 | #define __MPC_DECLSPEC __GMP_DECLSPEC_EXPORT |

119 | #else |

120 | #define __MPC_DECLSPEC __GMP_DECLSPEC |

121 | #endif |

122 | |

123 | #if defined (__cplusplus) |

124 | extern "C"{ |

125 | #endif |

126 | |

127 | __MPC_DECLSPEC int mpc_add (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

128 | __MPC_DECLSPEC int mpc_add_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t); |

129 | __MPC_DECLSPEC int mpc_add_si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t); |

130 | __MPC_DECLSPEC int mpc_add_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

131 | __MPC_DECLSPEC int mpc_sub (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

132 | __MPC_DECLSPEC int mpc_sub_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t); |

133 | __MPC_DECLSPEC int mpc_fr_sub (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t); |

134 | __MPC_DECLSPEC int mpc_sub_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

135 | __MPC_DECLSPEC int mpc_ui_ui_sub (mpc_ptr, unsigned long int, unsigned long int, mpc_srcptr, mpc_rnd_t); |

136 | __MPC_DECLSPEC int mpc_mul (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

137 | __MPC_DECLSPEC int mpc_mul_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t); |

138 | __MPC_DECLSPEC int mpc_mul_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

139 | __MPC_DECLSPEC int mpc_mul_si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t); |

140 | __MPC_DECLSPEC int mpc_mul_i (mpc_ptr, mpc_srcptr, int, mpc_rnd_t); |

141 | __MPC_DECLSPEC int mpc_sqr (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

142 | __MPC_DECLSPEC int mpc_div (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

143 | __MPC_DECLSPEC int mpc_pow (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

144 | __MPC_DECLSPEC int mpc_pow_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t); |

145 | __MPC_DECLSPEC int mpc_pow_ld (mpc_ptr, mpc_srcptr, long double, mpc_rnd_t); |

146 | __MPC_DECLSPEC int mpc_pow_d (mpc_ptr, mpc_srcptr, double, mpc_rnd_t); |

147 | __MPC_DECLSPEC int mpc_pow_si (mpc_ptr, mpc_srcptr, long, mpc_rnd_t); |

148 | __MPC_DECLSPEC int mpc_pow_ui (mpc_ptr, mpc_srcptr, unsigned long, mpc_rnd_t); |

149 | __MPC_DECLSPEC int mpc_pow_z (mpc_ptr, mpc_srcptr, mpz_srcptr, mpc_rnd_t); |

150 | __MPC_DECLSPEC int mpc_div_fr (mpc_ptr, mpc_srcptr, mpfr_srcptr, mpc_rnd_t); |

151 | __MPC_DECLSPEC int mpc_fr_div (mpc_ptr, mpfr_srcptr, mpc_srcptr, mpc_rnd_t); |

152 | __MPC_DECLSPEC int mpc_div_ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

153 | __MPC_DECLSPEC int mpc_ui_div (mpc_ptr, unsigned long int, mpc_srcptr, mpc_rnd_t); |

154 | __MPC_DECLSPEC int mpc_div_2ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

155 | __MPC_DECLSPEC int mpc_mul_2ui (mpc_ptr, mpc_srcptr, unsigned long int, mpc_rnd_t); |

156 | __MPC_DECLSPEC int mpc_div_2si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t); |

157 | __MPC_DECLSPEC int mpc_mul_2si (mpc_ptr, mpc_srcptr, long int, mpc_rnd_t); |

158 | __MPC_DECLSPEC int mpc_conj (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

159 | __MPC_DECLSPEC int mpc_neg (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

160 | __MPC_DECLSPEC int mpc_norm (mpfr_ptr, mpc_srcptr, mpfr_rnd_t); |

161 | __MPC_DECLSPEC int mpc_abs (mpfr_ptr, mpc_srcptr, mpfr_rnd_t); |

162 | __MPC_DECLSPEC int mpc_sqrt (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

163 | __MPC_DECLSPEC int mpc_set (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

164 | __MPC_DECLSPEC int mpc_set_d (mpc_ptr, double, mpc_rnd_t); |

165 | __MPC_DECLSPEC int mpc_set_d_d (mpc_ptr, double, double, mpc_rnd_t); |

166 | __MPC_DECLSPEC int mpc_set_ld (mpc_ptr, long double, mpc_rnd_t); |

167 | __MPC_DECLSPEC int mpc_set_ld_ld (mpc_ptr, long double, long double, mpc_rnd_t); |

168 | __MPC_DECLSPEC int mpc_set_f (mpc_ptr, mpf_srcptr, mpc_rnd_t); |

169 | __MPC_DECLSPEC int mpc_set_f_f (mpc_ptr, mpf_srcptr, mpf_srcptr, mpc_rnd_t); |

170 | __MPC_DECLSPEC int mpc_set_fr (mpc_ptr, mpfr_srcptr, mpc_rnd_t); |

171 | __MPC_DECLSPEC int mpc_set_fr_fr (mpc_ptr, mpfr_srcptr, mpfr_srcptr, mpc_rnd_t); |

172 | __MPC_DECLSPEC int mpc_set_q (mpc_ptr, mpq_srcptr, mpc_rnd_t); |

173 | __MPC_DECLSPEC int mpc_set_q_q (mpc_ptr, mpq_srcptr, mpq_srcptr, mpc_rnd_t); |

174 | __MPC_DECLSPEC int mpc_set_si (mpc_ptr, long int, mpc_rnd_t); |

175 | __MPC_DECLSPEC int mpc_set_si_si (mpc_ptr, long int, long int, mpc_rnd_t); |

176 | __MPC_DECLSPEC int mpc_set_ui (mpc_ptr, unsigned long int, mpc_rnd_t); |

177 | __MPC_DECLSPEC int mpc_set_ui_ui (mpc_ptr, unsigned long int, unsigned long int, mpc_rnd_t); |

178 | __MPC_DECLSPEC int mpc_set_z (mpc_ptr, mpz_srcptr, mpc_rnd_t); |

179 | __MPC_DECLSPEC int mpc_set_z_z (mpc_ptr, mpz_srcptr, mpz_srcptr, mpc_rnd_t); |

180 | __MPC_DECLSPEC void mpc_swap (mpc_ptr, mpc_ptr); |

181 | __MPC_DECLSPEC int mpc_fma (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); |

182 | |

183 | __MPC_DECLSPEC void mpc_set_nan (mpc_ptr); |

184 | |

185 | __MPC_DECLSPEC int mpc_real (mpfr_ptr, mpc_srcptr, mpfr_rnd_t); |

186 | __MPC_DECLSPEC int mpc_imag (mpfr_ptr, mpc_srcptr, mpfr_rnd_t); |

187 | __MPC_DECLSPEC int mpc_arg (mpfr_ptr, mpc_srcptr, mpfr_rnd_t); |

188 | __MPC_DECLSPEC int mpc_proj (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

189 | __MPC_DECLSPEC int mpc_cmp (mpc_srcptr, mpc_srcptr); |

190 | __MPC_DECLSPEC int mpc_cmp_si_si (mpc_srcptr, long int, long int); |

191 | __MPC_DECLSPEC int mpc_exp (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

192 | __MPC_DECLSPEC int mpc_log (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

193 | __MPC_DECLSPEC int mpc_log10 (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

194 | __MPC_DECLSPEC int mpc_sin (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

195 | __MPC_DECLSPEC int mpc_cos (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

196 | __MPC_DECLSPEC int mpc_sin_cos (mpc_ptr, mpc_ptr, mpc_srcptr, mpc_rnd_t, mpc_rnd_t); |

197 | __MPC_DECLSPEC int mpc_tan (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

198 | __MPC_DECLSPEC int mpc_sinh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

199 | __MPC_DECLSPEC int mpc_cosh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

200 | __MPC_DECLSPEC int mpc_tanh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

201 | __MPC_DECLSPEC int mpc_asin (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

202 | __MPC_DECLSPEC int mpc_acos (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

203 | __MPC_DECLSPEC int mpc_atan (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

204 | __MPC_DECLSPEC int mpc_asinh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

205 | __MPC_DECLSPEC int mpc_acosh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

206 | __MPC_DECLSPEC int mpc_atanh (mpc_ptr, mpc_srcptr, mpc_rnd_t); |

207 | __MPC_DECLSPEC void mpc_clear (mpc_ptr); |

208 | __MPC_DECLSPEC int mpc_urandom (mpc_ptr, gmp_randstate_t); |

209 | __MPC_DECLSPEC void mpc_init2 (mpc_ptr, mpfr_prec_t); |

210 | __MPC_DECLSPEC void mpc_init3 (mpc_ptr, mpfr_prec_t, mpfr_prec_t); |

211 | __MPC_DECLSPEC mpfr_prec_t mpc_get_prec (mpc_srcptr x); |

212 | __MPC_DECLSPEC void mpc_get_prec2 (mpfr_prec_t *pr, mpfr_prec_t *pi, mpc_srcptr x); |

213 | __MPC_DECLSPEC void mpc_set_prec (mpc_ptr, mpfr_prec_t); |

214 | __MPC_DECLSPEC const char * mpc_get_version (void); |

215 | |

216 | __MPC_DECLSPEC int mpc_strtoc (mpc_ptr, const char *, char **, int, mpc_rnd_t); |

217 | __MPC_DECLSPEC int mpc_set_str (mpc_ptr, const char *, int, mpc_rnd_t); |

218 | __MPC_DECLSPEC char * mpc_get_str (int, size_t, mpc_srcptr, mpc_rnd_t); |

219 | __MPC_DECLSPEC void mpc_free_str (char *); |

220 | |

221 | /* declare certain functions only if appropriate headers have been included */ |

222 | #ifdef _MPC_H_HAVE_INTMAX_T |

223 | __MPC_DECLSPEC int mpc_set_sj (mpc_ptr, intmax_t, mpc_rnd_t); |

224 | __MPC_DECLSPEC int mpc_set_uj (mpc_ptr, uintmax_t, mpc_rnd_t); |

225 | __MPC_DECLSPEC int mpc_set_sj_sj (mpc_ptr, intmax_t, intmax_t, mpc_rnd_t); |

226 | __MPC_DECLSPEC int mpc_set_uj_uj (mpc_ptr, uintmax_t, uintmax_t, mpc_rnd_t); |

227 | #endif |

228 | |

229 | #ifdef _Complex_I |

230 | __MPC_DECLSPEC int mpc_set_dc (mpc_ptr, double _Complex, mpc_rnd_t); |

231 | __MPC_DECLSPEC int mpc_set_ldc (mpc_ptr, long double _Complex, mpc_rnd_t); |

232 | __MPC_DECLSPEC double _Complex mpc_get_dc (mpc_srcptr, mpc_rnd_t); |

233 | __MPC_DECLSPEC long double _Complex mpc_get_ldc (mpc_srcptr, mpc_rnd_t); |

234 | #endif |

235 | |

236 | #ifdef _GMP_H_HAVE_FILE |

237 | __MPC_DECLSPEC int mpc_inp_str (mpc_ptr, FILE *, size_t *, int, mpc_rnd_t); |

238 | __MPC_DECLSPEC size_t mpc_out_str (FILE *, int, size_t, mpc_srcptr, mpc_rnd_t); |

239 | #endif |

240 | |

241 | #if defined (__cplusplus) |

242 | } |

243 | #endif |

244 | |

245 | #define mpc_realref(x) ((x)->re) |

246 | #define mpc_imagref(x) ((x)->im) |

247 | |

248 | #define mpc_cmp_si(x, y) \ |

249 | ( mpc_cmp_si_si ((x), (y), 0l) ) |

250 | #define mpc_ui_sub(x, y, z, r) mpc_ui_ui_sub (x, y, 0ul, z, r) |

251 | |

252 | /* |

253 | Define a fake mpfr_set_fr so that, for instance, mpc_set_fr_z would |

254 | be defined as follows: |

255 | mpc_set_fr_z (mpc_t rop, mpfr_t x, mpz_t y, mpc_rnd_t rnd) |

256 | MPC_SET_X_Y (fr, z, rop, x, y, rnd) |

257 | */ |

258 | #ifndef mpfr_set_fr |

259 | #define mpfr_set_fr mpfr_set |

260 | #endif |

261 | #define MPC_SET_X_Y(real_t, imag_t, z, real_value, imag_value, rnd) \ |

262 | { \ |

263 | int _inex_re, _inex_im; \ |

264 | _inex_re = (mpfr_set_ ## real_t) (mpc_realref (z), (real_value), MPC_RND_RE (rnd)); \ |

265 | _inex_im = (mpfr_set_ ## imag_t) (mpc_imagref (z), (imag_value), MPC_RND_IM (rnd)); \ |

266 | return MPC_INEX (_inex_re, _inex_im); \ |

267 | } |

268 | |

269 | #endif /* ifndef __MPC_H */ |

270 |