]> git.tdb.fi Git - libs/datafile.git/blobdiff - source/binfloat.h
Perform bit conversion using standard-sanctioned memcpy method
[libs/datafile.git] / source / binfloat.h
index 2c74441ad333888f1d47f98b1c3e449b40f98f6f..e50b3204ce974e992ca3cb52f5089456d8b16b39 100644 (file)
@@ -29,9 +29,6 @@ struct BinFloat
        template<typename T>
        struct MatchingInt;
 
-       template<typename T>
-       union Conversion;
-
        bool sign;
        bool infinity;
        int exponent;
@@ -54,27 +51,21 @@ struct BinFloat::MatchingInt<float> { typedef std::uint32_t Type; };
 template<>
 struct BinFloat::MatchingInt<double> { typedef std::uint64_t Type; };
 
-template<typename T>
-union BinFloat::Conversion
-{
-       T f;
-       typename MatchingInt<T>::Type i;
-};
-
 template<typename T>
 inline BinFloat BinFloat::explode_iec559(T v)
 {
-       Conversion<T> c;
-       c.f = v;
-       return explode(c.i, sizeof(T)*CHAR_BIT);
+       typename MatchingInt<T>::Type i;
+       memcpy(&v, &i, sizeof(T));
+       return explode(i, sizeof(T)*CHAR_BIT);
 }
 
 template<typename T>
 inline T BinFloat::compose_iec559()
 {
-       Conversion<T> c;
-       c.i = compose(sizeof(T)*CHAR_BIT);
-       return c.f;
+       typename MatchingInt<T>::Type i = compose(sizeof(T)*CHAR_BIT);
+       T v;
+       memcpy(&v, &i, sizeof(T));
+       return v;
 }
 
 } // namespace DataFile