0.9.9 API documentation: type_float.hpp Source File

| 0.9.9 API documentation

- Main Page
- Modules
- Files

- File List

type_float.hpp
1 #pragma once
2
3 #include "setup.hpp"
4
5 #if GLM_COMPILER == GLM_COMPILER_VC12
6 # pragma warning(push)
7 # pragma warning(disable: 4512) // assignment operator could not be generated
8 #endif
9
10 namespace glm{
11 namespace detail
12 {
13 template <typename T>
14 union float_t
15 {};
16
17 // https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
18 template <>
19 union float_t<float>
20 {
21 typedef int int_type;
22 typedef float float_type;
23
24 GLM_CONSTEXPR float_t(float_type Num = 0.0f) : f(Num) {}
25
26 GLM_CONSTEXPR float_t& operator=(float_t const& x)
27 {
28 f = x.f;
29 return *this;
30 }
31
32 // Portable extraction of components.
33 GLM_CONSTEXPR bool negative() const { return i < 0; }
34 GLM_CONSTEXPR int_type mantissa() const { return i & ((1 << 23) - 1); }
35 GLM_CONSTEXPR int_type exponent() const { return (i >> 23) & ((1 << 8) - 1); }
36
37 int_type i;
38 float_type f;
39 };
40
41 template <>
42 union float_t<double>
43 {
44 typedef detail::int64 int_type;
45 typedef double float_type;
46
47 GLM_CONSTEXPR float_t(float_type Num = static_cast<float_type>(0)) : f(Num) {}
48
49 GLM_CONSTEXPR float_t& operator=(float_t const& x)
50 {
51 f = x.f;
52 return *this;
53 }
54
55 // Portable extraction of components.
56 GLM_CONSTEXPR bool negative() const { return i < 0; }
57 GLM_CONSTEXPR int_type mantissa() const { return i & ((int_type(1) << 52) - 1); }
58 GLM_CONSTEXPR int_type exponent() const { return (i >> 52) & ((int_type(1) << 11) - 1); }
59
60 int_type i;
61 float_type f;
62 };
63 }//namespace detail
64 }//namespace glm
65
66 #if GLM_COMPILER == GLM_COMPILER_VC12
67 # pragma warning(pop)
68 #endif
glm::int64
detail::int64 int64
64 bit signed integer type.
Definition: scalar_int_sized.hpp:67
glm
Definition: common.hpp:20