Around 2015-2016 I created a fork of numpy with IEEE 128bit float support, but I never upstreamed it because I couldn't see a way to make it not depend on GCC/libquadmath (the licensing issue Chuck brought up). I wonder if it's possible now with the dtype changes to have different dtypes on different platforms (it didn't appear to be the case when I looked then), which would avoid the need to distribute third-party libraries to cover certain platforms.
Regards James On Fri, 18 Nov 2022 at 12:28, Scott Ransom <sran...@nrao.edu> wrote: > > > > On 11/17/22 7:13 PM, Charles R Harris wrote: > > > > > > On Thu, Nov 17, 2022 at 3:15 PM Ralf Gommers <ralf.gomm...@gmail.com > > <mailto:ralf.gomm...@gmail.com>> wrote: > > > > Hi all, > > > > We have to do something about long double support. This is something I > > wanted to propose a long > > time ago already, and moving build systems has resurfaced the pain yet > > again. > > > > This is not a full proposal yet, but the start of a discussion and > > gradual plan of attack. > > > > The problem > > ----------- > > The main problem is that long double support is *extremely* painful to > > maintain, probably far > > more than justified. I could write a very long story about that, but > > instead I'll just > > illustrate with some of the key points: > > > > (1) `long double` is the main reason why we're having such a hard time > > with building wheels on > > Windows, for SciPy in particular. This is because MSVC makes long > > double 64-bit, and Mingw-w64 > > defaults to 80-bit. So we have to deal with Mingw-w64 toolchains, > > proposed compiler patches, > > etc. This alone has been a massive time sink. A couple of threads: > > https://github.com/numpy/numpy/issues/20348 > > <https://github.com/numpy/numpy/issues/20348> > > > > https://discuss.scientific-python.org/t/releasing-or-not-32-bit-windows-wheels/282 > > > > <https://discuss.scientific-python.org/t/releasing-or-not-32-bit-windows-wheels/282> > > The first issue linked above is one of the key ones, with a lot of > > detail about the fundamental > > problems with `long double`. The Scientific Python thread focused more > > on Fortran, however that > > Fortran + Windows problem is at least partly the fault of `long > > double`. And Fortran may be > > rejuvenated with LFortran and fortran-lang.org > > <http://fortran-lang.org>; `long double` is a > > dead end. > > > > (2) `long double` is not a well-defined format. We support 9 specific > > binary representations, > > and have a ton of code floating around to check for those, and manually > > fiddle with individual > > bits in long double numbers. Part of that is the immediate pain point > > for me right now: in the > > configure stage of the build we consume object files produced by the > > compiler and parse them, > > matching some known bit patterns. This check is so weird that it's the > > only one that I cannot > > implement in Meson (short of porting the hundreds of lines of Python > > code for it to C), see > > https://github.com/mesonbuild/meson/issues/11068 > > <https://github.com/mesonbuild/meson/issues/11068> for details. To get > > an idea of the complexity > > here: > > > > https://github.com/numpy/numpy/blob/9e144f7c1598221510d49d8c6b79c66dc000edf6/numpy/core/setup_common.py#L264-L434 > > > > <https://github.com/numpy/numpy/blob/9e144f7c1598221510d49d8c6b79c66dc000edf6/numpy/core/setup_common.py#L264-L434> > > > > https://github.com/numpy/numpy/blob/9e144f7c1598221510d49d8c6b79c66dc000edf6/numpy/core/src/npymath/npy_math_private.h#L179-L484 > > > > <https://github.com/numpy/numpy/blob/9e144f7c1598221510d49d8c6b79c66dc000edf6/numpy/core/src/npymath/npy_math_private.h#L179-L484> > > > > https://github.com/numpy/numpy/blob/main/numpy/core/src/npymath/npy_math_complex.c.src#L598-L619 > > > > <https://github.com/numpy/numpy/blob/main/numpy/core/src/npymath/npy_math_complex.c.src#L598-L619> > > > > https://github.com/numpy/numpy/blob/main/numpy/core/src/multiarray/dragon4.c#L2480-L3052 > > > > <https://github.com/numpy/numpy/blob/main/numpy/core/src/multiarray/dragon4.c#L2480-L3052> > > Typically `long double` has multiple branches, and requires more code > > than float/double. > > > > (3) We spend a lot of time dealing with issues and PR to keep `long > > double` working, as well as > > dealing with hard-to-diagnose build issues. Which sometimes even stops > > people from > > building/contributing, especially on Windows. Some recent examples: > > https://github.com/numpy/numpy/pull/20360 > > <https://github.com/numpy/numpy/pull/20360> > > https://github.com/numpy/numpy/pull/18536 > > <https://github.com/numpy/numpy/pull/18536> > > https://github.com/numpy/numpy/pull/21813 > > <https://github.com/numpy/numpy/pull/21813> > > https://github.com/numpy/numpy/pull/22405 > > <https://github.com/numpy/numpy/pull/22405> > > https://github.com/numpy/numpy/pull/19950 > > <https://github.com/numpy/numpy/pull/19950> > > https://github.com/numpy/numpy/pull/18330/commits/aa9fd3c7cb > > <https://github.com/numpy/numpy/pull/18330/commits/aa9fd3c7cb> > > https://github.com/scipy/scipy/issues/16769 > > <https://github.com/scipy/scipy/issues/16769> > > https://github.com/numpy/numpy/issues/14574 > > <https://github.com/numpy/numpy/issues/14574> > > > > (4) `long double` isn't all that useful. On both Windows and macOS > > `long double` is 64-bit, > > which means it is just a poor alias to `double`. So it does literally > > nothing for the majority > > of our users, except confuse them and take up extra memory. On Linux, > > `long double` is 80-bit > > precision, which means it doesn't do all that much there either, just a > > modest bump in precision. > > > > Let me also note that it's not just the user-visible dtypes that we > > have to consider; long > > double types are also baked into the libnpymath static library that we > > ship with NumPy. That's a > > thing we have to do something about anyway (shipping static libraries > > is not the best idea, see > > https://github.com/numpy/numpy/issues/20880 > > <https://github.com/numpy/numpy/issues/20880>). We > > just have to make sure to not forget about it when thinking about > > solutions here. > > > > > > Potential solutions > > ------------------- > > > > (A) The ideal solution would be to have a proper, portable > > quad-precision (128 bits of > > precision) dtype. It's now possible to write that externally, after all > > the work that Sebastian > > and others have put into the dtype infrastructure. The dtype itself > > already exists > > (https://github.com/peytondmurray/quaddtype > > <https://github.com/peytondmurray/quaddtype>, maybe > > there are more implementations floating around). It just need the > > people who have an actual need > > for it to drive that. It's still a significant amount of work, so I'll > > not go into this one more > > right now. > > > > (B) Full deprecation and removal of all `long double` support from > > NumPy (and SciPy), > > irrespective of whether the quad dtype comes to life. > > > > Given the current state, I'm personally convinced that that is easily > > justified. However, I know > > some folks are going to be hesitant, given that we don't know how many > > remaining users we have > > or what use cases they have. So let's see if we can find more granular > > solutions (note: these > > are ideas, not all fully researched solutions that we can pick from and > > are guaranteed to work > > out well). > > > > (C) Only support `long double` where it has proper compiler support > > (C99/C++11), so using it > > "just works". And remove all the support for old formats and accessing > > bit representations > > directly. This also implies making some optional functions mandatory. > > For example, the issue I > > ran into today showed up at runtime in a fallback path for systems that > > don't have `strtold_l`. > > We don't test such fallback paths in CI, so they're going to be fragile > > anyway. > > > > (D) Add a build mode with a command-line flag, where we typedef `long > > double` to `double`. I'll > > note that we already touched on that once (see > > https://github.com/numpy/numpy/issues/20348 > > <https://github.com/numpy/numpy/issues/20348>); I'm not sure though if > > it's fundamentally not a > > good idea or that we just didn't do it intentionally enough. > > > > > > Next steps > > ---------- > > > > First, it would be great to hear from folks who have use cases for long > > double support in NumPy. > > So far we have very little knowledge of that, we only see the problems > > and work it causes us. > > > > Second, I'm going to have to add support for (C) or (D) temporarily to > > the Meson build anyway, > > as we run into things. It can be worked around if we really have to by > > implementing support for > > long double format detection in Meson, or by rewriting all the > > detection logic so it's > > all-in-one in C. But that takes a significant amount of time. > > > > Third, let's figure out which way we'd like to go. Do you see > > alternative solutions? Or like any > > of the ones I listed more than others? Are you willing to jump in and > > work on a quad dtype? > > > > Cheers, > > Ralf > > > > > > I would agree that extended precision is pretty useless, IIRC, it was > > mostly intended as an accurate > > way to produce double precision results. That idea was eventually dropped > > as not very useful. I'd > > happily do away with subnormal doubles as well, they were another not very > > useful idea. And strictly > > speaking, we should not support IBM double-double either, it is not in the > > IEEE standard. > > > > That said, I would like to have a quad precision type. That precision is > > useful for some things, and > > I have a dream that someday it can be used for a time type. Unfortunately, > > last time I looked > > around, none of the available implementations had a NumPy compatible > > license. > > > > The tricky thing here is to not break downstream projects, but that may be > > unavoidable. I suspect > > the fallout will not be that bad. > > > > Chuck > > A quick response from one of the leaders of a team that requires 80bit > extended precision for > astronomical work... > > "extended precision is pretty useless" unless you need it. And the > high-precision pulsar timing > community needs it. Standard double precision (64-bit) values do not contain > enough precision for us > to pass relative astronomical times via a single float without extended > precision (the precision > ends up being at the ~1 microsec level over decades of time differences, and > we need it at the > ~1-10ns level) nor can we store the measured spin frequencies (or do > calculations on them) of our > millisecond pulsars with enough precision. Those spin frequencies can have > 16-17 digits of base-10 > precision (i.e. we measure them to that precision). This is why we use 80-bit > floats (usually via > Linux, but also on non X1 Mac hardware if you use the correct compilers) > extensively. > > Numpy is a key component of the PINT software to do high-precision pulsar > timing, and we use it > partly *because* it has long double support (with 80-bit extended precision): > https://github.com/nanograv/PINT > And see the published paper here, particularly Sec 3.3.1 and footnote #42: > https://ui.adsabs.harvard.edu/abs/2021ApJ...911...45L/abstract > > Going to software quad precision would certainly work, but it would > definitely make things much > slower for our matrix and vector math. > > We would definitely love to see a solution for this that allows us to get the > extra precision we > need on other platforms besides Intel/AMD64+Linux (primarily), but giving up > extended precision on > those platforms would *definitely* hurt. I can tell you that the pulsar > community would definitely > be against option "B". And I suspect that there are other users out there as > well. > > Scott > NANOGrav Chair > www.nanograv.org > > > -- > Scott M. Ransom Address: NRAO > Phone: (434) 296-0320 520 Edgemont Rd. > email: sran...@nrao.edu Charlottesville, VA 22903 USA > GPG Fingerprint: A40A 94F2 3F48 4136 3AC4 9598 92D5 25CB 22A6 7B65 > _______________________________________________ > NumPy-Discussion mailing list -- numpy-discussion@python.org > To unsubscribe send an email to numpy-discussion-le...@python.org > https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ > Member address: aragilar+nu...@gmail.com _______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-le...@python.org https://mail.python.org/mailman3/lists/numpy-discussion.python.org/ Member address: arch...@mail-archive.com