<div dir="ltr">Hi all,<div><br></div><div>Visual C++ 2015 supports this one:</div><div><br></div><div><a href="https://msdn.microsoft.com/en-us/library/h0dff77w.aspx">https://msdn.microsoft.com/en-us/library/h0dff77w.aspx</a><br></div><div><br></div><div>In any case, this is easy to implement an efficient fallback in C, unlike the fma() function we discussed some time ago.</div><div><br></div><div>To put this in a bit wider perspective: would it be useful to investigate how much of the C99 math library could</div><div>be supported in Python in general?</div><div><br></div><div>Stephan</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-02-04 12:52 GMT+01:00  <span dir="ltr"><<a href="mailto:tritium-list@sdamon.com" target="_blank">tritium-list@sdamon.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div class="m_-9089231173961507883WordSection1"><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">The presence of the function in C99’s math.h isn’t strictly useful unless it is also in the MSVC math.h.  MSVC only supports a subset of C99<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"><u></u> <u></u></span></p><div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0in 0in 0in"><p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Python-ideas [mailto:<a href="mailto:python-ideas-bounces%2Btritium-list" target="_blank">python-ideas-bounces+<wbr>tritium-list</a>=<a href="mailto:sdamon.com@python.org" target="_blank">sdamon.com@<wbr>python.org</a>] <b>On Behalf Of </b>Juraj Sukop<br><b>Sent:</b> Saturday, February 4, 2017 6:31 AM<br><b>To:</b> <a href="mailto:python-ideas@python.org" target="_blank">python-ideas@python.org</a><br><b>Subject:</b> [Python-ideas] math.nextafter<u></u><u></u></span></p></div></div><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">Hello!<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Function `nextafter(x, y)` returns the next representable value of `x` in the direction of `y`, and if `x` equals to `y`, `y` is returned. [1]<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">It is useful for incrementing/decrementing floating-point number by the smallest amount possible or for testing if two numbers are closest to each other without being the same.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">The following snippet written by Mark Dickinson emulates the functionality in pure Python [2]:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">    import math<u></u><u></u></p></div><div><p class="MsoNormal">    import struct<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">    def next_up(x):<u></u><u></u></p></div><div><p class="MsoNormal">        # NaNs and positive infinity map to themselves.<u></u><u></u></p></div><div><p class="MsoNormal">        if math.isnan(x) or (math.isinf(x) and x > 0):<u></u><u></u></p></div><div><p class="MsoNormal">            return x<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">        # 0.0 and -0.0 both map to the smallest +ve float.<u></u><u></u></p></div><div><p class="MsoNormal">        if x == 0.0:<u></u><u></u></p></div><div><p class="MsoNormal">            x = 0.0<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">        n = struct.unpack('<q', struct.pack('<d', x))[0]<u></u><u></u></p></div><div><p class="MsoNormal">        if n >= 0:<u></u><u></u></p></div><div><p class="MsoNormal">            n += 1<u></u><u></u></p></div><div><p class="MsoNormal">        else:<u></u><u></u></p></div><div><p class="MsoNormal">            n -= 1<u></u><u></u></p></div><div><p class="MsoNormal">        return struct.unpack('<d', struct.pack('<q', n))[0]<u></u><u></u></p></div><div><p class="MsoNormal">    <u></u><u></u></p></div><div><p class="MsoNormal">    def next_down(x):<u></u><u></u></p></div><div><p class="MsoNormal">        return -next_up(-x)<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">    def next_after(x, y):<u></u><u></u></p></div><div><p class="MsoNormal">        # If either argument is a NaN, return that argument.<u></u><u></u></p></div><div><p class="MsoNormal">        # This matches the implementation in decimal.Decimal<u></u><u></u></p></div><div><p class="MsoNormal">        if math.isnan(x):<u></u><u></u></p></div><div><p class="MsoNormal">            return x<u></u><u></u></p></div><div><p class="MsoNormal">        if math.isnan(y):<u></u><u></u></p></div><div><p class="MsoNormal">            return y<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">        if y == x:<u></u><u></u></p></div><div><p class="MsoNormal">            return y<u></u><u></u></p></div><div><p class="MsoNormal">        elif y > x:<u></u><u></u></p></div><div><p class="MsoNormal">            return next_up(x)<u></u><u></u></p></div><div><p class="MsoNormal">        else:<u></u><u></u></p></div><div><p class="MsoNormal">            return next_down(x)<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Other implementations can be found at [3], [4] or [5], for example.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">It would be useful to have `math.nextafter` function available in standard library, it also is provided by C99 <math.h>, and is similar in spirit to `math.copysign` or `math.isclose`.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">As to why to include it by default when the above snippet works just fine, a C implementation is likely to be much faster than using `struct.pack` and `struct.unpack`.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Thank you for considering this proposal and any feedback is greatly welcomed!<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Juraj Sukop<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">[1] <a href="http://en.cppreference.com/w/c/numeric/math/nextafter" target="_blank">http://en.cppreference.com/w/<wbr>c/numeric/math/nextafter</a><u></u><u></u></p></div><div><p class="MsoNormal">[2] <a href="http://stackoverflow.com/a/10426033" target="_blank">http://stackoverflow.com/a/<wbr>10426033</a><u></u><u></u></p></div><div><p class="MsoNormal">[3] <a href="http://git.musl-libc.org/cgit/musl/tree/src/math/nextafter.c" target="_blank">http://git.musl-libc.org/cgit/<wbr>musl/tree/src/math/nextafter.c</a><u></u><u></u></p></div><div><p class="MsoNormal">[4] <a href="https://github.com/android/platform_bionic/blob/master/libm/upstream-freebsd/lib/msun/src/s_nextafter.c" target="_blank">https://github.com/android/<wbr>platform_bionic/blob/master/<wbr>libm/upstream-freebsd/lib/<wbr>msun/src/s_nextafter.c</a><u></u><u></u></p></div><div><p class="MsoNormal">[5] <a href="https://github.com/golang/go/blob/master/src/math/nextafter.go" target="_blank">https://github.com/golang/go/<wbr>blob/master/src/math/<wbr>nextafter.go</a><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div></div></div></div><br>______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br></blockquote></div><br></div>