Compile time float binary representation

Jeremie Pelletier jeremiep at gmail.com
Fri Jul 31 19:34:57 PDT 2009


Jeremie Pelletier Wrote:

> Andrei Alexandrescu Wrote:
> 
> > Jeremie Pelletier wrote:
> > > Is there a way to convert a float (or double/real) to an integral number without changing its binary representation at compile time?
> > > 
> > > I need to extract the sign, exponent and mantissa yet I cant use bit shifting.
> > > "Error: 'R' is not of integral type, it is a real" is the error I get.
> > > 
> > > The usual *cast(uint*)&value wont work either at compile time.
> > > 
> > > Any suggestions?
> > 
> > I got this to work, would it be applicable to your need?
> > 
> > void main(string[] args)
> > {
> >      union A
> >      {
> >          double x;
> >          int y;
> >      }
> >      enum A a = A(0.3);
> >      writeln(a.x);
> >      writeln(a.y);
> > }
> > 
> > 
> > Andrei
> 
> Good suggestion, however it doesnt work the way I need it:
> 
> ---
> template FloatParts(real R) {
>     union A {
>         real theReal;
>         struct {
>             ushort hi;
>             ulong lo;
>         }
>     }
>     
>     A a = cast(A)R; // Error: cannot cast real to immutable(A)
>     enum A a = A(R); // members cannot be used at runtime
> }
> ---
> 
> I need to gather .sign, .exp and .mantissa among others (possibly a .radix too) and use them at compile time (generic metaprogramming, or else i would just fallback to runtime).
> 
> Unless there are arithmetic methods to get these, I dont see how it can be done without changes in the compiler first.
> 
> To Walter: is this something possible for DMD2.32?

After some toying around, I managed to get some results:

---
import std.metastrings;
immutable union A {
	double x;
	int y;
}
pragma(msg, ToString!(A(5.2).y));
---

but it crashed dmd (2.031) instead of printing 3435973837 to stdout.




More information about the Digitalmars-d mailing list