]> gitweb.factorcode.org Git - factor.git/commitdiff
Revert "float_bits: cleaner way to cast between bits and float/double"
authorDoug Coleman <doug.coleman@gmail.com>
Sun, 13 Feb 2022 20:56:04 +0000 (14:56 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Sun, 13 Feb 2022 20:57:07 +0000 (14:57 -0600)
This reverts commit e030e1a62fbf273e353af1f15866f81e2db1284f.

Works but has warnings and is undefined behavior. Also doesn't fix
the issue with NAN: 123 setting the qnan bit.

Can safely use `bit_cast` with C++20 someday.

vm/float_bits.hpp

index 2db5b70fbadf08e75fd0c178769cd10403221d0a..3a2e1474c4db98ec22e922f6c8f6775129dd4422 100644 (file)
@@ -1,19 +1,40 @@
 namespace factor {
 
+// Some functions for converting floating point numbers to binary
+// representations and vice versa
+
+union double_bits_pun {
+  double x;
+  uint64_t y;
+};
+
 inline static uint64_t double_bits(double x) {
-  return *(reinterpret_cast<uint64_t*>(&x));
+  double_bits_pun b;
+  b.x = x;
+  return b.y;
 }
 
 inline static double bits_double(uint64_t y) {
-  return *(reinterpret_cast<double*>(&y));
+  double_bits_pun b;
+  b.y = y;
+  return b.x;
 }
 
+union float_bits_pun {
+  float x;
+  uint32_t y;
+};
+
 inline static uint32_t float_bits(float x) {
-  return *(reinterpret_cast<uint32_t*>(&x));
+  float_bits_pun b;
+  b.x = x;
+  return b.y;
 }
 
 inline static float bits_float(uint32_t y) {
-  return *(reinterpret_cast<float*>(&y));
+  float_bits_pun b;
+  b.y = y;
+  return b.x;
 }
 
 }