Ah, I see. I don't have any good suggestions I'm afraid (other than change
both rounding modes), but you can simplify your macro slightly:
macro new_round_down(expr, T)
quote
with_rounding($T, RoundDown) do
$expr
end
end
end
As someone who cares about rounding modes, you might also be interested in
this discussion on the julia-dev list:
https://groups.google.com/d/topic/julia-dev/yuq-2phXon0/discussion
Simon
On Friday, 10 October 2014 14:03:02 UTC+1, David P. Sanders wrote:
>
>
>
> El viernes, 10 de octubre de 2014 05:15:48 UTC-5, Simon Byrne escribió:
>>
>>
>>
>> On Friday, 10 October 2014 04:12:37 UTC+1, David P. Sanders wrote:
>>>
>>> I believe (but please correct me if I'm wrong) that I do need a macro,
>>> since I use it with whole expressions to ensure the correct rounding, for
>>> example
>>> (simplifying) something like
>>>
>>> @round_down( min(a*b, c*d) )
>>>
>>
>> You can use with_rounding for this:
>>
>> with_rounding(() -> min(a*b,c*d), T, RoundDown)
>>
>> or equivalently, with do syntax:
>>
>> with_rounding(T, RoundDown) do
>> min(a*b,c*d)
>> end
>>
>
>
> Thanks. I should have been more clear.
> I was previously using with_rounding, but in order to avoid this being
> littered through the code, I wanted to hide it somewhere,
> and this somewhere thus has to be a macro, in order to avoid the
> arithmetic being performed before the function was even called:
>
> macro round_down(expr)quote
> with_rounding(BigFloat, RoundDown) do $expr end endend
>
> (Not sure what happened to the indentation when copying from GitHub,
> sorry.)
>
> This works great when everything is BigFloats.
> But now I want to add the possibility that intervals store either Float64s
> or BigFloats, so I wanted the
> macro to also check the type of its argument, which is where my original
> code came from.
>
> One solution would be to add an explicit parameter T to the @round_down
> macro, e.g. the following
> which avoids eval at the expense of a repetitive code smell:
>
> macro new_round_down(expr, T)
> if T == :Float64
> quote
> with_rounding(Float64, RoundDown) do
> $expr
> end
> end
> elseif T == :BigFloat
> quote
> with_rounding(BigFloat, RoundDown) do
> $expr
> end
> end
> end
> end
>
> But this again makes the code more messy, since the Interval type must now
> be parametrised (which may be a good idea anyway!)
>
>