[Issue 11320] std.math.fmod, round, trunc are not yet pure
    d-bugmail at puremagic.com 
    d-bugmail at puremagic.com
       
    Fri Oct 26 10:24:15 UTC 2018
    
    
  
https://issues.dlang.org/show_bug.cgi?id=11320
--- Comment #3 from Simon Naarmann <eiderdaus at gmail.com> ---
I see no problems to making fmod() pure.
But with round(), here's the Phobos code:
    auto round(real x) @trusted nothrow @nogc
    {
        version (CRuntime_Microsoft)
        {
            auto old = FloatingPointControl.getControlState();
            FloatingPointControl.setControlState(
                (old & (-1 - FloatingPointControl.roundingMask))
                | FloatingPointControl.roundToZero
            );
            x = rint((x >= 0) ? x + 0.5 : x - 0.5);
            FloatingPointControl.setControlState(old);
            return x;
        }
        else
            return core.stdc.math.roundl(x);
    }
Can the CRuntime_Microsoft version ever be pure? It backs up global state of
the CPU's floating point processing, then restores it:
    static void setControlState(ControlState newState) @trusted
    {
        version (InlineAsm_X86_Any)
        {
            asm nothrow @nogc
            {
                fclex;
                fldcw newState;
            }
            // Also update MXCSR, SSE's control register.
            // ...
                asm nothrow @nogc { ldmxcsr mxcsr; }
        // ...
How should this be handled w.r.t. purity? I haven't looked at all into how such
CPU state behaves with multithreaded code. For now, I'd have to leave round()
as impure across all platforms.
--
    
    
More information about the Digitalmars-d-bugs
mailing list