Boost logo

Boost :

Subject: Re: [boost] [review][constrained_value] Review of Constrained Value Library begins today
From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2008-12-09 07:23:31


Kim Barrett skrev:
> At 2:23 PM +0100 12/6/08, Robert Kawulak wrote:
>> ... maybe the problem
>> could be somehow solved if we have a function float exact(float) that,
>> given a
>> floating point value (that may have greater precision because of
>> caching in a
>> register), returns a value that is truncated (has exactly the
>> precision of
>> float, not greater).
>
> I think that something along the lines of the following will likely work:
>
> inline double exact(double x) {
> struct { volatile double x; } xx = { x };
> return xx.x;
> }
>
> The idea is to force the value to make a round trip through a memory
> location of the "correct" size. The use of volatile should prevent
> the compiler from optimizing away the trip through memory.
>
> If worried about whether a compiler will really do what's needed here,
> then I think the only other option is inline assembler to produce the
> equivalent behavior. Looking through the x86 instruction set, I don't
> see any other way to cause the desired rounding.

For some ABIs I think using class instead of struct will have the
desired effect of passing the value on the stack. So maybe something like

template< class T >
class rounder { ... };

template< class T >
inline T exact( rounder<T> r )
{ return r.val(); }

-Thorsten


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk