Boost logo

Boost :

From: Peder Holt (peder.holt_at_[hidden])
Date: 2005-06-11 02:32:39


On 6/11/05, David Abrahams <dave_at_[hidden]> wrote:
> Peder Holt <peder.holt_at_[hidden]> writes:
>
> > On 6/10/05, David Abrahams <dave_at_[hidden]> wrote:
> >> Peder Holt <peder.holt_at_[hidden]> writes:
> >>
> >> >> c.f. http://gcc.gnu.org/ml/gcc/2005-01/msg01744.html
> >> >> and the last two items here:
> >> >> http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Deprecated-Features.html#Deprecated-Features
> >> >
> >> > Oh, well. Anyway, I have now uploaded a version of this to the vault:
> >> > metamath.zip
> >> > that is mpl-compliant and supports comparison and arithmetics with the
> >> > same accuracy as normal double arithmetics. Does not support NaN.
> >>
> >> Does it get around the comparison problem somehow?
> >>
> >> I think the results when a floating point value is converted to an
> >> integral that can't represent it are undefined (or something similar)
> >> but at least most compilers won't stop you. You might try to do some
> >> awful thing like transforming
> >>
> >> a < b
> >>
> >> into
> >>
> >> long(b - a) > 0
> >>
> >
> > I am not quite sure I understand the problem correctly.
>
> The problem is that a < b is not a compile-time constant when a and b
> are floating. If you use such comparisons internally to your library,
> it is nonportable.

Ahh, but you have the same problem with a-b, or indeed with any operation.
The only thing that compiles with comeau online in strict mode, is
long(a), where a is a double literal, and this doesn't do much good.

The building up of a double is nonportable, and I haven't tried to
tackle this problem.
So far, the only compilers I have tried that did not accept operators
on doubles to form compile time constants, is Comeau in strict mode
and Digital Mars.

Borland, VC [6.5 ,8beta], GCC [?, 4.0.0> on the other hand,
accepts the syntax.

It is probably possible to create a less elegant way to construct a
double_, not involving non-standard functionality.
Once a double_ is formed, it is possible to do (most of) the
arithmetics on integral constants, as described in previous mail.

Regards,
Peder

>
> > What I do is
> > the following:
> > BOOST_STATIC_CONSTANT(bool,value=(BOOST_DOUBLE_EVAL(N1)<BOOST_DOUBLE_EVAL(N2)));
> >
> > So the comparison is not a very big problem.
>
> I don't know what BOOST_DOUBLE_EVAL does, so that is opaque to me.
>
> --
> Dave Abrahams
> Boost Consulting
> www.boost-consulting.com
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>


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