/* * The Rin Library – floating point module * * Copyright (C) 2015 Gediminas Jakutis * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; version 2.1 * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef LIBRIN_FLOAT_INCLUDED #define LIBRIN_FLOAT_INCLUDED #include #include /* * TODO: * · more modes */ static const unsigned int RIN_HEXSTRING_DEFAULT = 0x00000000u; static const unsigned int RIN_HEXSTRING_NOPREFIX = 0x00000001u; /* * All following the functions assume IEEE 754 floating point numbers * and thus are only expected to work only on systems which use IEEE 754. * * The versions suffixed with "d" / double versions are otherwise * identical to the float counterparts. */ uint32_t rin_signbitf(const float num); uint64_t rin_signbitd(const double num); char *rin_float_to_hexstring(const float num, char *str, unsigned int mode); char *rin_double_to_hexstring(const double num, char *str, unsigned int mode); unsigned int rin_compare_float(const float a, const float b, uint32_t max_ulps); unsigned int rin_compare_rin_vec2(const struct rin_vec2 a, const struct rin_vec2 b, uint32_t max_ulps); unsigned int rin_compare_rin_vec3(const struct rin_vec3 a, const struct rin_vec3 b, uint32_t max_ulps); unsigned int rin_compare_rin_vec4(const struct rin_vec4 a, const struct rin_vec4 b, uint32_t max_ulps); unsigned int rin_compare_double(const double a, const double b, uint64_t max_ulps); unsigned int rin_compare_rin_vec2d(const struct rin_vec2d a, const struct rin_vec2d b, uint64_t max_ulps); unsigned int rin_compare_rin_vec3d(const struct rin_vec3d a, const struct rin_vec3d b, uint64_t max_ulps); unsigned int rin_compare_rin_vec4d(const struct rin_vec4d a, const struct rin_vec4d b, uint64_t max_ulps); uint32_t rin_float_to_uint(const float num); int32_t rin_float_to_int(const float num); float rin_uint_to_float(const uint32_t num); float rin_int_to_float(const int32_t num); uint64_t rin_double_to_ulong(const double num); int64_t rin_double_to_long(const double num); double rin_ulong_to_double(const uint64_t num); double rin_long_to_double(const int64_t num); #endif /* LIBRIN_FLOAT_INCLUDED */