TODO 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. Copyright 1999-2016 Free Software Foundation, Inc.
  2. Contributed by the AriC and Caramba projects, INRIA.
  3. This file is part of the GNU MPFR Library.
  4. The GNU MPFR Library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or (at your
  7. option) any later version.
  8. The GNU MPFR Library is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
  11. License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
  14. http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
  15. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  16. Table of contents:
  17. 1. Documentation
  18. 2. Installation
  19. 3. Changes in existing functions
  20. 4. New functions to implement
  21. 5. Efficiency
  22. 6. Miscellaneous
  23. 7. Portability
  24. ##############################################################################
  25. 1. Documentation
  26. ##############################################################################
  27. - add a description of the algorithms used + proof of correctness
  28. ##############################################################################
  29. 2. Installation
  30. ##############################################################################
  31. - if we want to distinguish GMP and MPIR, we can check at configure time
  32. the following symbols which are only defined in MPIR:
  33. #define __MPIR_VERSION 0
  34. #define __MPIR_VERSION_MINOR 9
  35. #define __MPIR_VERSION_PATCHLEVEL 0
  36. There is also a library symbol mpir_version, which should match VERSION, set
  37. by configure, for example 0.9.0.
  38. ##############################################################################
  39. 3. Changes in existing functions
  40. ##############################################################################
  41. - export mpfr_overflow and mpfr_underflow as public functions
  42. - many functions currently taking into account the precision of the *input*
  43. variable to set the initial working precison (acosh, asinh, cosh, ...).
  44. This is nonsense since the "average" working precision should only depend
  45. on the precision of the *output* variable (and maybe on the *value* of
  46. the input in case of cancellation).
  47. -> remove those dependencies from the input precision.
  48. - mpfr_can_round:
  49. change the meaning of the 2nd argument (err). Currently the error is
  50. at most 2^(MPFR_EXP(b)-err), i.e. err is the relative shift wrt the
  51. most significant bit of the approximation. I propose that the error
  52. is now at most 2^err ulps of the approximation, i.e.
  53. 2^(MPFR_EXP(b)-MPFR_PREC(b)+err).
  54. - mpfr_set_q first tries to convert the numerator and the denominator
  55. to mpfr_t. But this conversion may fail even if the correctly rounded
  56. result is representable. New way to implement:
  57. Function q = a/b. nq = PREC(q) na = PREC(a) nb = PREC(b)
  58. If na < nb
  59. a <- a*2^(nb-na)
  60. n <- na-nb+ (HIGH(a,nb) >= b)
  61. if (n >= nq)
  62. bb <- b*2^(n-nq)
  63. a = q*bb+r --> q has exactly n bits.
  64. else
  65. aa <- a*2^(nq-n)
  66. aa = q*b+r --> q has exactly n bits.
  67. If RNDN, takes nq+1 bits. (See also the new division function).
  68. ##############################################################################
  69. 4. New functions to implement
  70. ##############################################################################
  71. - implement mpfr_q_sub, mpfr_z_div, mpfr_q_div?
  72. - implement functions for random distributions, see for example
  73. https://sympa.inria.fr/sympa/arc/mpfr/2010-01/msg00034.html
  74. (suggested by Charles Karney <ckarney@Sarnoff.com>, 18 Jan 2010):
  75. * a Bernoulli distribution with prob p/q (exact)
  76. * a general discrete distribution (i with prob w[i]/sum(w[i]) (Walker
  77. algorithm, but make it exact)
  78. * a uniform distribution in (a,b)
  79. * exponential distribution (mean lambda) (von Neumann's method?)
  80. * normal distribution (mean m, s.d. sigma) (ratio method?)
  81. - wanted for Magma [John Cannon <john@maths.usyd.edu.au>, Tue, 19 Apr 2005]:
  82. HypergeometricU(a,b,s) = 1/gamma(a)*int(exp(-su)*u^(a-1)*(1+u)^(b-a-1),
  83. u=0..infinity)
  84. JacobiThetaNullK
  85. PolylogP, PolylogD, PolylogDold: see http://arxiv.org/abs/math.CA/0702243
  86. and the references herein.
  87. JBessel(n, x) = BesselJ(n+1/2, x)
  88. IncompleteGamma [also wanted by <keith.briggs@bt.com> 4 Feb 2008: Gamma(a,x),
  89. gamma(a,x), P(a,x), Q(a,x); see A&S 6.5, ref. [Smith01] in algorithms.bib]
  90. KBessel, KBessel2 [2nd kind]
  91. JacobiTheta
  92. LogIntegral
  93. ExponentialIntegralE1
  94. E1(z) = int(exp(-t)/t, t=z..infinity), |arg z| < Pi
  95. mpfr_eint1: implement E1(x) for x > 0, and Ei(-x) for x < 0
  96. E1(NaN) = NaN
  97. E1(+Inf) = +0
  98. E1(-Inf) = -Inf
  99. E1(+0) = +Inf
  100. E1(-0) = -Inf
  101. DawsonIntegral
  102. GammaD(x) = Gamma(x+1/2)
  103. - functions defined in the LIA-2 standard
  104. + minimum and maximum (5.2.2): max, min, max_seq, min_seq, mmax_seq
  105. and mmin_seq (mpfr_min and mpfr_max correspond to mmin and mmax);
  106. + rounding_rest, floor_rest, ceiling_rest (5.2.4);
  107. + remr (5.2.5): x - round(x/y) y;
  108. + error functions from 5.2.7 (if useful in MPFR);
  109. + power1pm1 (5.3.6.7): (1 + x)^y - 1;
  110. + logbase (5.3.6.12): \log_x(y);
  111. + logbase1p1p (5.3.6.13): \log_{1+x}(1+y);
  112. + rad (5.3.9.1): x - round(x / (2 pi)) 2 pi = remr(x, 2 pi);
  113. + axis_rad (5.3.9.1) if useful in MPFR;
  114. + cycle (5.3.10.1): rad(2 pi x / u) u / (2 pi) = remr(x, u);
  115. + axis_cycle (5.3.10.1) if useful in MPFR;
  116. + sinu, cosu, tanu, cotu, secu, cscu, cossinu, arcsinu, arccosu,
  117. arctanu, arccotu, arcsecu, arccscu (5.3.10.{2..14}):
  118. sin(x 2 pi / u), etc.;
  119. [from which sinpi(x) = sin(Pi*x), ... are trivial to implement, with u=2.]
  120. + arcu (5.3.10.15): arctan2(y,x) u / (2 pi);
  121. + rad_to_cycle, cycle_to_rad, cycle_to_cycle (5.3.11.{1..3}).
  122. - From GSL, missing special functions (if useful in MPFR):
  123. (cf http://www.gnu.org/software/gsl/manual/gsl-ref.html#Special-Functions)
  124. + The Airy functions Ai(x) and Bi(x) defined by the integral representations:
  125. * Ai(x) = (1/\pi) \int_0^\infty \cos((1/3) t^3 + xt) dt
  126. * Bi(x) = (1/\pi) \int_0^\infty (e^(-(1/3) t^3) + \sin((1/3) t^3 + xt)) dt
  127. * Derivatives of Airy Functions
  128. + The Bessel functions for n integer and n fractional:
  129. * Regular Modified Cylindrical Bessel Functions I_n
  130. * Irregular Modified Cylindrical Bessel Functions K_n
  131. * Regular Spherical Bessel Functions j_n: j_0(x) = \sin(x)/x,
  132. j_1(x)= (\sin(x)/x-\cos(x))/x & j_2(x)= ((3/x^2-1)\sin(x)-3\cos(x)/x)/x
  133. Note: the "spherical" Bessel functions are solutions of
  134. x^2 y'' + 2 x y' + [x^2 - n (n+1)] y = 0 and satisfy
  135. j_n(x) = sqrt(Pi/(2x)) J_{n+1/2}(x). They should not be mixed with the
  136. classical Bessel Functions, also noted j0, j1, jn, y0, y1, yn in C99
  137. and mpfr.
  138. Cf https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions
  139. *Irregular Spherical Bessel Functions y_n: y_0(x) = -\cos(x)/x,
  140. y_1(x)= -(\cos(x)/x+\sin(x))/x &
  141. y_2(x)= (-3/x^3+1/x)\cos(x)-(3/x^2)\sin(x)
  142. * Regular Modified Spherical Bessel Functions i_n:
  143. i_l(x) = \sqrt{\pi/(2x)} I_{l+1/2}(x)
  144. * Irregular Modified Spherical Bessel Functions:
  145. k_l(x) = \sqrt{\pi/(2x)} K_{l+1/2}(x).
  146. + Clausen Function:
  147. Cl_2(x) = - \int_0^x dt \log(2 \sin(t/2))
  148. Cl_2(\theta) = \Im Li_2(\exp(i \theta)) (dilogarithm).
  149. + Dawson Function: \exp(-x^2) \int_0^x dt \exp(t^2).
  150. + Debye Functions: D_n(x) = n/x^n \int_0^x dt (t^n/(e^t - 1))
  151. + Elliptic Integrals:
  152. * Definition of Legendre Forms:
  153. F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t)))
  154. E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t)))
  155. P(\phi,k,n) = \int_0^\phi dt 1/((1 + n \sin^2(t))\sqrt(1 - k^2 \sin^2(t)))
  156. * Complete Legendre forms are denoted by
  157. K(k) = F(\pi/2, k)
  158. E(k) = E(\pi/2, k)
  159. * Definition of Carlson Forms
  160. RC(x,y) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1)
  161. RD(x,y,z) = 3/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-3/2)
  162. RF(x,y,z) = 1/2 \int_0^\infty dt (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2)
  163. RJ(x,y,z,p) = 3/2 \int_0^\infty dt
  164. (t+x)^(-1/2) (t+y)^(-1/2) (t+z)^(-1/2) (t+p)^(-1)
  165. + Elliptic Functions (Jacobi)
  166. + N-relative exponential:
  167. exprel_N(x) = N!/x^N (\exp(x) - \sum_{k=0}^{N-1} x^k/k!)
  168. + exponential integral:
  169. E_2(x) := \Re \int_1^\infty dt \exp(-xt)/t^2.
  170. Ei_3(x) = \int_0^x dt \exp(-t^3) for x >= 0.
  171. Ei(x) := - PV(\int_{-x}^\infty dt \exp(-t)/t)
  172. + Hyperbolic/Trigonometric Integrals
  173. Shi(x) = \int_0^x dt \sinh(t)/t
  174. Chi(x) := Re[ \gamma_E + \log(x) + \int_0^x dt (\cosh[t]-1)/t]
  175. Si(x) = \int_0^x dt \sin(t)/t
  176. Ci(x) = -\int_x^\infty dt \cos(t)/t for x > 0
  177. AtanInt(x) = \int_0^x dt \arctan(t)/t
  178. [ \gamma_E is the Euler constant ]
  179. + Fermi-Dirac Function:
  180. F_j(x) := (1/r\Gamma(j+1)) \int_0^\infty dt (t^j / (\exp(t-x) + 1))
  181. + Pochhammer symbol (a)_x := \Gamma(a + x)/\Gamma(a) : see [Smith01] in
  182. algorithms.bib
  183. logarithm of the Pochhammer symbol
  184. + Gegenbauer Functions
  185. + Laguerre Functions
  186. + Eta Function: \eta(s) = (1-2^{1-s}) \zeta(s)
  187. Hurwitz zeta function: \zeta(s,q) = \sum_0^\infty (k+q)^{-s}.
  188. + Lambert W Functions, W(x) are defined to be solutions of the equation:
  189. W(x) \exp(W(x)) = x.
  190. This function has multiple branches for x < 0 (2 funcs W0(x) and Wm1(x))
  191. + Trigamma Function psi'(x).
  192. and Polygamma Function: psi^{(m)}(x) for m >= 0, x > 0.
  193. - from gnumeric (www.gnome.org/projects/gnumeric/doc/function-reference.html):
  194. - beta
  195. - betaln
  196. - degrees
  197. - radians
  198. - sqrtpi
  199. - mpfr_inp_raw, mpfr_out_raw (cf mail "Serialization of mpfr_t" from Alexey
  200. and answer from Granlund on mpfr list, May 2007)
  201. - [maybe useful for SAGE] implement companion frac_* functions to the rint_*
  202. functions. For example mpfr_frac_floor(x) = x - floor(x). (The current
  203. mpfr_frac function corresponds to mpfr_rint_trunc.)
  204. - scaled erfc (https://sympa.inria.fr/sympa/arc/mpfr/2009-05/msg00054.html)
  205. - asec, acsc, acot, asech, acsch and acoth (mail from Björn Terelius on mpfr
  206. list, 18 June 2009)
  207. ##############################################################################
  208. 5. Efficiency
  209. ##############################################################################
  210. - implement a mpfr_sqrthigh algorithm based on Mulders' algorithm, with a
  211. basecase variant
  212. - use mpn_div_q to speed up mpfr_div. However mpn_div_q, which is new in
  213. GMP 5, is not documented in the GMP manual, thus we are not sure it
  214. guarantees to return the same quotient as mpn_tdiv_qr.
  215. Also mpfr_div uses the remainder computed by mpn_divrem. A workaround would
  216. be to first try with mpn_div_q, and if we cannot (easily) compute the
  217. rounding, then use the current code with mpn_divrem.
  218. - compute exp by using the series for cosh or sinh, which has half the terms
  219. (see Exercise 4.11 from Modern Computer Arithmetic, version 0.3)
  220. The same method can be used for log, using the series for atanh, i.e.,
  221. atanh(x) = 1/2*log((1+x)/(1-x)).
  222. - improve mpfr_gamma (see https://code.google.com/p/fastfunlib/). A possible
  223. idea is to implement a fast algorithm for the argument reconstruction
  224. gamma(x+k). One could also use the series for 1/gamma(x), see for example
  225. http://dlmf.nist.gov/5/7/ or formula (36) from
  226. http://mathworld.wolfram.com/GammaFunction.html
  227. - fix regression with mpfr_mpz_root (from Keith Briggs, 5 July 2006), for
  228. example on 3Ghz P4 with gmp-4.2, x=12.345:
  229. prec=50000 k=2 k=3 k=10 k=100
  230. mpz_root 0.036 0.072 0.476 7.628
  231. mpfr_mpz_root 0.004 0.004 0.036 12.20
  232. See also mail from Carl Witty on mpfr list, 09 Oct 2007.
  233. - implement Mulders algorithm for squaring and division
  234. - for sparse input (say x=1 with 2 bits), mpfr_exp is not faster than for
  235. full precision when precision <= MPFR_EXP_THRESHOLD. The reason is
  236. that argument reduction kills sparsity. Maybe avoid argument reduction
  237. for sparse input?
  238. - speed up const_euler for large precision [for x=1.1, prec=16610, it takes
  239. 75% of the total time of eint(x)!]
  240. - speed up mpfr_atan for large arguments (to speed up mpc_log)
  241. [from Mark Watkins on Fri, 18 Mar 2005]
  242. Also mpfr_atan(x) seems slower (by a factor of 2) for x near from 1.
  243. Example on a Athlon for 10^5 bits: x=1.1 takes 3s, whereas 2.1 takes 1.8s.
  244. The current implementation does not give monotonous timing for the following:
  245. mpfr_random (x); for (i = 0; i < k; i++) mpfr_atan (y, x, MPFR_RNDN);
  246. for precision 300 and k=1000, we get 1070ms, and 500ms only for p=400!
  247. - improve mpfr_sin on values like ~pi (do not compute sin from cos, because
  248. of the cancellation). For instance, reduce the input modulo pi/2 in
  249. [-pi/4,pi/4], and define auxiliary functions for which the argument is
  250. assumed to be already reduced (so that the sin function can avoid
  251. unnecessary computations by calling the auxiliary cos function instead of
  252. the full cos function). This will require a native code for sin, for
  253. example using the reduction sin(3x)=3sin(x)-4sin(x)^3.
  254. See https://sympa.inria.fr/sympa/arc/mpfr/2007-08/msg00001.html and
  255. the following messages.
  256. - improve generic.c to work for number of terms <> 2^k
  257. - rewrite mpfr_greater_p... as native code.
  258. - mpf_t uses a scheme where the number of limbs actually present can
  259. be less than the selected precision, thereby allowing low precision
  260. values (for instance small integers) to be stored and manipulated in
  261. an mpf_t efficiently.
  262. Perhaps mpfr should get something similar, especially if looking to
  263. replace mpf with mpfr, though it'd be a major change. Alternately
  264. perhaps those mpfr routines like mpfr_mul where optimizations are
  265. possible through stripping low zero bits or limbs could check for
  266. that (this would be less efficient but easier).
  267. - try the idea of the paper "Reduced Cancellation in the Evaluation of Entire
  268. Functions and Applications to the Error Function" by W. Gawronski, J. Mueller
  269. and M. Reinhard, to be published in SIAM Journal on Numerical Analysis: to
  270. avoid cancellation in say erfc(x) for x large, they compute the Taylor
  271. expansion of erfc(x)*exp(x^2/2) instead (which has less cancellation),
  272. and then divide by exp(x^2/2) (which is simpler to compute).
  273. - replace the *_THRESHOLD macros by global (TLS) variables that can be
  274. changed at run time (via a function, like other variables)? One benefit
  275. is that users could use a single MPFR binary on several machines (e.g.,
  276. a library provided by binary packages or shared via NFS) with different
  277. thresholds. On the default values, this would be a bit less efficient
  278. than the current code, but this isn't probably noticeable (this should
  279. be tested). Something like:
  280. long *mpfr_tune_get(void) to get the current values (the first value
  281. is the size of the array).
  282. int mpfr_tune_set(long *array) to set the tune values.
  283. int mpfr_tune_run(long level) to find the best values (the support
  284. for this feature is optional, this can also be done with an
  285. external function).
  286. - better distinguish different processors (for example Opteron and Core 2)
  287. and use corresponding default tuning parameters (as in GMP). This could be
  288. done in configure.ac to avoid hacking config.guess, for example define
  289. MPFR_HAVE_CORE2.
  290. Note (VL): the effect on cross-compilation (that can be a processor
  291. with the same architecture, e.g. compilation on a Core 2 for an
  292. Opteron) is not clear. The choice should be consistent with the
  293. build target (e.g. -march or -mtune value with gcc).
  294. Also choose better default values. For instance, the default value of
  295. MPFR_MUL_THRESHOLD is 40, while the best values that have been found
  296. are between 11 and 19 for 32 bits and between 4 and 10 for 64 bits!
  297. - during the Many Digits competition, we noticed that (our implantation of)
  298. Mulders short product was slower than a full product for large sizes.
  299. This should be precisely analyzed and fixed if needed.
  300. ##############################################################################
  301. 6. Miscellaneous
  302. ##############################################################################
  303. - [suggested by Tobias Burnus <burnus(at)net-b.de> and
  304. Asher Langton <langton(at)gcc.gnu.org>, Wed, 01 Aug 2007]
  305. support quiet and signaling NaNs in mpfr:
  306. * functions to set/test a quiet/signaling NaN: mpfr_set_snan, mpfr_snan_p,
  307. mpfr_set_qnan, mpfr_qnan_p
  308. * correctly convert to/from double (if encoding of s/qNaN is fixed in 754R)
  309. - check again coverage: on 2007-07-27, Patrick Pelissier reports that the
  310. following files are not tested at 100%: add1.c, atan.c, atan2.c,
  311. cache.c, cmp2.c, const_catalan.c, const_euler.c, const_log2.c, cos.c,
  312. gen_inverse.h, div_ui.c, eint.c, exp3.c, exp_2.c, expm1.c, fma.c, fms.c,
  313. lngamma.c, gamma.c, get_d.c, get_f.c, get_ld.c, get_str.c, get_z.c,
  314. inp_str.c, jn.c, jyn_asympt.c, lngamma.c, mpfr-gmp.c, mul.c, mul_ui.c,
  315. mulders.c, out_str.c, pow.c, print_raw.c, rint.c, root.c, round_near_x.c,
  316. round_raw_generic.c, set_d.c, set_ld.c, set_q.c, set_uj.c, set_z.c, sin.c,
  317. sin_cos.c, sinh.c, sqr.c, stack_interface.c, sub1.c, sub1sp.c, subnormal.c,
  318. uceil_exp2.c, uceil_log2.c, ui_pow_ui.c, urandomb.c, yn.c, zeta.c, zeta_ui.c.
  319. - check the constants mpfr_set_emin (-16382-63) and mpfr_set_emax (16383) in
  320. get_ld.c and the other constants, and provide a testcase for large and
  321. small numbers.
  322. - from Kevin Ryde <user42@zip.com.au>:
  323. Also for pi.c, a pre-calculated compiled-in pi to a few thousand
  324. digits would be good value I think. After all, say 10000 bits using
  325. 1250 bytes would still be small compared to the code size!
  326. Store pi in round to zero mode (to recover other modes).
  327. - add a new rounding mode: round to nearest, with ties away from zero
  328. (this is roundTiesToAway in 754-2008, could be used by mpfr_round)
  329. - add a new roundind mode: round to odd. If the result is not exactly
  330. representable, then round to the odd mantissa. This rounding
  331. has the nice property that for k > 1, if:
  332. y = round(x, p+k, TO_ODD)
  333. z = round(y, p, TO_NEAREST_EVEN), then
  334. z = round(x, p, TO_NEAREST_EVEN)
  335. so it avoids the double-rounding problem.
  336. - add tests of the ternary value for constants
  337. - When doing Extensive Check (--enable-assert=full), since all the
  338. functions use a similar use of MACROS (ZivLoop, ROUND_P), it should
  339. be possible to do such a scheme:
  340. For the first call to ROUND_P when we can round.
  341. Mark it as such and save the approximated rounding value in
  342. a temporary variable.
  343. Then after, if the mark is set, check if:
  344. - we still can round.
  345. - The rounded value is the same.
  346. It should be a complement to tgeneric tests.
  347. - in div.c, try to find a case for which cy != 0 after the line
  348. cy = mpn_sub_1 (sp + k, sp + k, qsize, cy);
  349. (which should be added to the tests), e.g. by having {vp, k} = 0, or
  350. prove that this cannot happen.
  351. - add a configure test for --enable-logging to ignore the option if
  352. it cannot be supported. Modify the "configure --help" description
  353. to say "on systems that support it".
  354. - add generic bad cases for functions that don't have an inverse
  355. function that is implemented (use a single Newton iteration).
  356. - add bad cases for the internal error bound (by using a dichotomy
  357. between a bad case for the correct rounding and some input value
  358. with fewer Ziv iterations?).
  359. - add an option to use a 32-bit exponent type (int) on LP64 machines,
  360. mainly for developers, in order to be able to test the case where the
  361. extended exponent range is the same as the default exponent range, on
  362. such platforms.
  363. Tests can be done with the exp-int branch (added on 2010-12-17, and
  364. many tests fail at this time).
  365. - test underflow/overflow detection of various functions (in particular
  366. mpfr_exp) in reduced exponent ranges, including ranges that do not
  367. contain 0.
  368. - add an internal macro that does the equivalent of the following?
  369. MPFR_IS_ZERO(x) || MPFR_GET_EXP(x) <= value
  370. - check whether __gmpfr_emin and __gmpfr_emax could be replaced by
  371. a constant (see README.dev). Also check the use of MPFR_EMIN_MIN
  372. and MPFR_EMAX_MAX.
  373. ##############################################################################
  374. 7. Portability
  375. ##############################################################################
  376. - add a web page with results of builds on different architectures
  377. - support the decimal64 function without requiring --with-gmp-build
  378. - [Kevin about texp.c long strings]
  379. For strings longer than c99 guarantees, it might be cleaner to
  380. introduce a "tests_strdupcat" or something to concatenate literal
  381. strings into newly allocated memory. I thought I'd done that in a
  382. couple of places already. Arrays of chars are not much fun.
  383. - use https://gcc.gnu.org/viewcvs/gcc/trunk/config/stdint.m4 for mpfr-gmp.h