mdickinson / bigfloat

Python wrapper for MPFR, providing high-precision floating-point arithmetic
GNU Lesser General Public License v3.0
43 stars 11 forks source link

Please release a new version (and put it on PyPi) #79

Closed HJarausch closed 4 years ago

HJarausch commented 6 years ago

The current version 0.3.0 does NOT build with Python3.7 and some distributions have switched to this recent Python version.

MNRK01 commented 5 years ago

The following patch for the file "mpfr.c" in the bigfloat code allows me to build 64-bit bigfloat on Windows 10 with Python 3.7.1 (Anaconda 5.3.0 edition) using msys2 and mingw-w64 gcc 8.1.0 without any issues.

--- mpfr.c.orig 2014-07-06 10:58:27.000000000 -0500
+++ mpfr.c  2018-10-30 22:34:44.194885900 -0500
@@ -7654,7 +7654,7 @@
  * def mpfr_pow(Mpfr_t rop not None, Mpfr_t op1 not None, Mpfr_t op2 not None,
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = __Pyx_PyInt_From_int(mpfr_root((&__pyx_v_rop->_value), (&__pyx_v_op->_value), __pyx_v_k, __pyx_v_rnd)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyInt_From_int(mpfr_rootn_ui((&__pyx_v_rop->_value), (&__pyx_v_op->_value), __pyx_v_k, __pyx_v_rnd)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
@@ -31259,12 +31259,12 @@
     *value = local_value;
     *tb = local_tb;
 #if CYTHON_COMPILING_IN_CPYTHON
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = local_type;
-    tstate->exc_value = local_value;
-    tstate->exc_traceback = local_tb;
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = local_type;
+    tstate->curexc_value = local_value;
+    tstate->curexc_traceback = local_tb;
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
@@ -31286,12 +31286,12 @@
     PyObject *tmp_type, *tmp_value, *tmp_tb;
 #if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = *type;
-    tstate->exc_value = *value;
-    tstate->exc_traceback = *tb;
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = *type;
+    tstate->curexc_value = *value;
+    tstate->curexc_traceback = *tb;
 #else
     PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
     PyErr_SetExcInfo(*type, *value, *tb);
@@ -31304,9 +31304,9 @@
 static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
 #if CYTHON_COMPILING_IN_CPYTHON
     PyThreadState *tstate = PyThreadState_GET();
-    *type = tstate->exc_type;
-    *value = tstate->exc_value;
-    *tb = tstate->exc_traceback;
+    *type = tstate->curexc_type;
+    *value = tstate->curexc_value;
+    *tb = tstate->curexc_traceback;
     Py_XINCREF(*type);
     Py_XINCREF(*value);
     Py_XINCREF(*tb);
@@ -31318,12 +31318,12 @@
 #if CYTHON_COMPILING_IN_CPYTHON
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = type;
-    tstate->exc_value = value;
-    tstate->exc_traceback = tb;
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = type;
+    tstate->curexc_value = value;
+    tstate->curexc_traceback = tb;
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);

You will still need to compile gmp (6.1.2 for me) and mpfr (4.0.1 for me) prior to compiling bigfloat using the same version of gcc as above.

I briefly testing the bigfloat 0.3.0 wheel and it gives the right results based on the bigfloat documentation:

In [2]: from bigfloat import *
   ...: print(sqrt(2, precision(100)))  # compute sqrt(2) with 100 bits of precision
   ...: with precision(100):     # another way to get the same result
   ...:     print(sqrt(2))
   ...: my_context = precision(100) + RoundTowardPositive
   ...: print(my_context)
   ...: print(sqrt(2, my_context))      # and another, this time rounding up
   ...: with RoundTowardNegative: # a lower bound for zeta(2)
   ...:     print(sum(1/sqr(n) for n in range(1, 10000)))
   ...: print(zeta(2)) # actual value, for comparison
   ...: print(const_pi()**2/6.0)  # double check value
   ...: quadruple_precision  # context implementing IEEE 754 binary128 format
   ...: print(next_up(0, quadruple_precision))  # smallest subnormal for binary128
   ...: print(log2(next_up(0, quadruple_precision)))
1.4142135623730950488016887242092
1.4142135623730950488016887242092
Context(precision=100, rounding=ROUND_TOWARD_POSITIVE)
1.4142135623730950488016887242108
1.6448340618469506
1.6449340668482264
1.6449340668482264
6.47517511943802511092443895822764655e-4966
-16494.000000000000

In [3]: 

Good luck.

brlauuu commented 5 years ago

Is there an update on this issue? Pip installation of bigfloat on Mac is still not working with Python3.7.

DNS commented 4 years ago

Can't install using pip on Python 3.8, Win10

mdickinson commented 4 years ago

There's now a new release on PyPI: https://pypi.org/project/bigfloat/0.4.0/. I'm able to install from PyPI on Python 2.7 and Python 3.5 through Python 3.8 on macOS. Please let me know of any issues you encounter.

To avoid future issues like this, it may make sense to perform the Cythonization at install time rather than at sdist creation time. I'll open a separate issue for that.

Apologies for taking so long to get to this; my free time is in short supply. If anyone is interested in co-maintaining (or even taking over maintainership) for this package, please let me know - I'd be happy to discuss.