Why don't we switch to C like floating pointed arithmetic instead of automatic expansion to reals?

Seb via Digitalmars-d digitalmars-d at puremagic.com
Fri Aug 5 04:27:05 PDT 2016


On Friday, 5 August 2016 at 09:40:59 UTC, Ilya Yaroshenko wrote:
> On Friday, 5 August 2016 at 09:24:49 UTC, Walter Bright wrote:
>> On 8/5/2016 12:43 AM, Ilya Yaroshenko wrote:
>>> You are wrong that there are far fewer of those cases. This 
>>> is naive point of
>>> view. A lot of netlib math functions require exact IEEE 
>>> arithmetic. Tinflex
>>> requires it. Python C backend and Mir library require exact 
>>> IEEE arithmetic.
>>> Atmosphere package requires it, Atmosphere is used as 
>>> reference code for my
>>> publication in JMS, Springer. And the most important case: no 
>>> one top scientific
>>> laboratory will use a language without exact IEEE arithmetic 
>>> by default.
>>
>> A library has a lot of algorithms in it, a library requiring 
>> exact IEEE arithmetic doesn't mean every algorithm in it does. 
>> None of the Phobos math library functions require it, and as 
>> far as I can tell they are correct out to the last bit.
>
> No. For example std.math.log requires it! But you don't care 
> about other compilers which not use yl2x and about making it 
> template (real version slows down code for double and float).

Yep.

1) There are some function (exp, pow, log, round, sqrt) for which 
using llvm_intrinsincs significantly increases your performance.

It's a simple benchmark and might be flawed, but I hope it shows 
the point.

Code is here: 
https://gist.github.com/wilzbach/2b64e10dec66a3153c51fbd1e6848f72

> ldmd -inline -release -O3 -boundscheck=off test.d

fun: pow
std.math.pow   = 15 secs, 914 ms, 102 μs, and 8 hnsecs
core.stdc.pow  = 11 secs, 590 ms, 702 μs, and 5 hnsecs
llvm_pow       = 13 secs, 570 ms, 439 μs, and 7 hnsecs
fun: exp
std.math.exp   = 6 secs, 85 ms, 741 μs, and 7 hnsecs
core.stdc.exp  = 16 secs, 267 ms, 997 μs, and 4 hnsecs
llvm_exp       = 2 secs, 22 ms, and 876 μs
fun: exp2
std.math.exp2  = 3 secs, 117 ms, 624 μs, and 2 hnsecs
core.stdc.exp2 = 2 secs, 973 ms, and 243 μs
llvm_exp2      = 2 secs, 451 ms, 628 μs, and 9 hnsecs
fun: sin
std.math.sin   = 1 sec, 805 ms, 626 μs, and 7 hnsecs
core.stdc.sin  = 17 secs, 743 ms, 33 μs, and 5 hnsecs
llvm_sin       = 2 secs, 95 ms, and 178 μs
fun: cos
std.math.cos   = 2 secs, 820 ms, 684 μs, and 5 hnsecs
core.stdc.cos  = 17 secs, 626 ms, 78 μs, and 1 hnsec
llvm_cos       = 2 secs, 814 ms, 60 μs, and 5 hnsecs
fun: log
std.math.log   = 5 secs, 584 ms, 344 μs, and 5 hnsecs
core.stdc.log  = 16 secs, 443 ms, 893 μs, and 3 hnsecs
llvm_log       = 2 secs, 13 ms, 291 μs, and 1 hnsec
fun: log2
std.math.log2  = 5 secs, 583 ms, 777 μs, and 7 hnsecs
core.stdc.log2 = 2 secs, 800 ms, 848 μs, and 5 hnsecs
llvm_log2      = 2 secs, 165 ms, 849 μs, and 6 hnsecs
fun: sqrt
std.math.sqrt  = 799 ms and 917 μs
core.stdc.sqrt = 864 ms, 834 μs, and 7 hnsecs
llvm_sqrt      = 439 ms, 469 μs, and 2 hnsecs
fun: ceil
std.math.ceil  = 540 ms and 167 μs
core.stdc.ceil = 971 ms, 533 μs, and 6 hnsecs
llvm_ceil      = 562 ms, 490 μs, and 2 hnsecs
fun: round
std.math.round = 3 secs, 52 ms, 567 μs, and 3 hnsecs
core.stdc.round = 958 ms and 217 μs
llvm_round     = 590 ms, 742 μs, and 7 hnsecs


2) As mentioned before they can yield _different_ results

https://dpaste.dzfl.pl/c0ab5131b49d


More information about the Digitalmars-d mailing list