#pragma once #ifndef FP16_BITCASTS_H #define FP16_BITCASTS_H #if defined(__cplusplus) && (__cplusplus >= 201103L) #include #elif !defined(__OPENCL_VERSION__) #include #endif static inline float fp32_from_bits(uint32_t w) { #if defined(__OPENCL_VERSION__) return as_float(w); #elif defined(__CUDA_ARCH__) return __uint_as_float((unsigned int) w); #elif defined(__INTEL_COMPILER) return _castu32_f32(w); #else union { uint32_t as_bits; float as_value; } fp32 = { w }; return fp32.as_value; #endif } static inline uint32_t fp32_to_bits(float f) { #if defined(__OPENCL_VERSION__) return as_uint(f); #elif defined(__CUDA_ARCH__) return (uint32_t) __float_as_uint(f); #elif defined(__INTEL_COMPILER) return _castf32_u32(f); #else union { float as_value; uint32_t as_bits; } fp32 = { f }; return fp32.as_bits; #endif } static inline double fp64_from_bits(uint64_t w) { #if defined(__OPENCL_VERSION__) return as_double(w); #elif defined(__CUDA_ARCH__) return __longlong_as_double((long long) w); #elif defined(__INTEL_COMPILER) return _castu64_f64(w); #else union { uint64_t as_bits; double as_value; } fp64 = { w }; return fp64.as_value; #endif } static inline uint64_t fp64_to_bits(double f) { #if defined(__OPENCL_VERSION__) return as_ulong(f); #elif defined(__CUDA_ARCH__) return (uint64_t) __double_as_longlong(f); #elif defined(__INTEL_COMPILER) return _castf64_u64(f); #else union { double as_value; uint64_t as_bits; } fp64 = { f }; return fp64.as_bits; #endif } #endif /* FP16_BITCASTS_H */