Denis Koroskin wrote:
On Sat, 04 Apr 2009 15:19:46 +0400, Philip Miess <philip.mi...@yahoo.com> wrote:

of course my example makes no sense
try

pure float square(float x, invariant roundingMode round = default)
{
     return x*x;
}
in case that helps

Phil

I don't see roundingMode used anywhere in your example.


Denis,
the rounding mode is set globally so if you set it before calling a function it would be used to round the results of a floating point multiply. Anyway here is a better example thats much like one I have actually compiled.

import std.c.fenv;
import std.math;

pure long myround(real x, int round = fegetround() )
{
        //fsetround(round);
        return lrint(x);
}

int main(char[][] args)
{
        long result;
        result = round(2.6);
        //result is now 3

        fsetround(FE_DOWNWARD);
        result = round(2.6);
        //result is now 2
}

If DMD was memoizing the function it should not think that these both these calls return the same thing.

Unless of course DMD is too smart/not smart enough and doesn't realize that the second parameter is important and optimizes it away.

In that case uncomment the call to fesetround with the round parameter inside myround(). Also you may want to do things like check if the current round mode is the same as the current round mode and only set it if it's not. Then you may like to set it back to the original afterwards to make it act like a pure function.

Phil

Reply via email to