[Cython] Cygwin: Handling missing C99 long double functions

Robert Bradshaw robertwb at math.washington.edu
Thu Apr 28 03:29:52 EDT 2016


On Wed, Apr 27, 2016 at 3:07 AM, Erik Bray <erik.m.bray at gmail.com> wrote:

> On Tue, Apr 26, 2016 at 10:55 PM, Robert Bradshaw <robertwb at gmail.com>
> wrote:
> > On Tue, Apr 26, 2016 at 8:36 AM, Erik Bray <erik.m.bray at gmail.com>
> wrote:
> >>
> >> On Tue, Apr 26, 2016 at 5:16 PM, Dima Pasechnik
> >> <dimpase+github at gmail.com> wrote:
> >> > Hi,
> >> > certainly we did something with Sage on cygwin to work around these...
> >> > Just in case,
> >>
> >> From what I can tell there are several places where Sage has hacked
> >> around this issue in different packages, but it's not doing anything
> >> specifically with it for Cython.  Sage uses the Cephes math lib to
> >> support these functions on FreeBSD--and apparently used to use it on
> >> Cygwin too, but disabled that for some reason.
> >>
> >> Regardless, Cython should ultimately do something sensible in these
> cases.
> >>
> >> My general thinking is that in cases where Cython generates code
> >> containing C math functions, it ought to support a fallback.  This
> >> will require some feature checks so that Cython can generate wrappers,
> >> when necessary, around the double versions of those functions (as
> >> Numpy currently does).
> >
> >
> > Let's make things concrete. You're complaining that something like
> >
> > cdef extern from "math.h":
> >     long double sqrtl(long double)
> >
> > def foo(long double x):
> >     return sqrtl(x)
> >
> > Doesn't work on Cygwin?
> >
> > The same is true for *any* C function that you use that's not totally
> > portable (this is the bane of trying to use C). I don't think Cython
> should
> > be detecting this and substituting a (less accurate) sqrt for sqrtl in
> this
> > case. If you want do do this, write your own headers that (conditionally)
> > define these things however you want.
>
> No, not at all.  That would be silly.  Let me be clearer...
>
> > Or, are you complaining that Cython's test suite doesn't pass on some
> Cygwin
> > because there are tests of features not available on Cygwin? (Your
> original
> > email isn't clear.) If so, the test framework can be set up to exclude
> these
> > tests on that platform.
>
> There are really two concerns.  This is one of them, yes.  The first
> question is what would be the best way to exclude certain tests on
> certain platforms?  There's no clear documentation on that (which is
> fine, but it's why I'm asking :)
>

Probably add a tag and then modify runtests.py to detect Cygwin and
automatically add this to the exclusion list.

The second concern, and more serious, is that there *are* cases where
> Cython generates code that uses long double functions where, for
> example, long double is passed as an argument.  For example the
> following code
>
>     def truncate_long_double(long double x):
>         cdef float r = int(x)
>         return r
>
> compiles to something that includes:
>
>       /* "truncl.pyx":2
>      * def truncate_long_double(long double x):
>      *     cdef float r = int(x)             # <<<<<<<<<<<<<<
>      *     return r
>      */
>       __pyx_t_1 = truncl(__pyx_v_x);
>       __pyx_v_r = __pyx_t_1;
>
>       /* "truncl.pyx":3
>      * def truncate_long_double(long double x):
>      *     cdef float r = int(x)
>      *     return r             # <<<<<<<<<<<<<<
>      */
>       __Pyx_XDECREF(__pyx_r);
>       __pyx_t_2 = PyFloat_FromDouble(__pyx_v_r); if
> (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error)
>
> It's not not clear what the best way would be to *not* use this code
> on platforms where truncl missing (and there are a handful of other
> examples besides truncl). This code is generated by an optimization
> that was added here: http://trac.cython.org/ticket/400  In this case
> replacing truncl with trunc shouldn't hurt.
>

Here, yes, but in general truncl(x) != trunc(x) for, say, 2**54 + 1.

It's not uncommon (I think) to ship pre-cythonized C sources in a
> package's source distribution so that it can be installed (especially
> by pip) without requiring the user to have Cython.  This code will
> fail to compile on platforms like Cygwin.
>
> But it's not clear how to handle this at Cythonization time either
> since it doesn't know in advance what platform it will be targeting.
> I'm suggesting that maybe rather than using these functions directly
> Cython should generate some fallbacks for where they're not available,
> or at least have the option to.


The safest is to never use the long double type in this case--we assume
that if long double is present (used), so are the corresponding functions
in math.h (which is wrong for this platform, but if we need to use powl I
don't know what else to do). Alternatively, ship your own (conditionally
defined) fallbacks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cython-devel/attachments/20160428/30d7d14f/attachment.html>


More information about the cython-devel mailing list