File: cbf_ulp.h

package info (click to toggle)
cbflib 0.9.6%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 56,196 kB
  • sloc: ansic: 103,920; python: 4,552; sh: 3,032; makefile: 1,822; yacc: 659; f90: 210; xml: 210; cpp: 58; java: 16
file content (69 lines) | stat: -rw-r--r-- 2,225 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**********************************************************************
 *                                                                    *
 * Comparison functions for single & double precision floating point  *
 * numbers, which function correctly in the presence of NaNs &        *
 * infinities but don't account for denormalised numbers              *
 *                                                                    *
 *    J.Sloan, 06/2013                                                *
 *                                                                    *
 **********************************************************************
 *                                                                    *
 * YOU MAY REDISTRIBUTE THE CBFLIB PACKAGE UNDER THE TERMS OF THE GPL *
 *                                                                    *
 * ALTERNATIVELY YOU MAY REDISTRIBUTE THE CBFLIB API UNDER THE TERMS  *
 * OF THE LGPL                                                        *
 *                                                                    *
 *********************************************************************/

#ifndef CBF_ULP_H
#define CBF_ULP_H

#ifdef __cplusplus

extern "C" {

#endif

#include <stdint.h>

#ifndef UINT64_MAX
#define NO_UINT64_TYPE
#endif

#ifndef isinf
#define isinf32(x) (!(((*(unsigned int*)&x)&0x7fffffff)^0x7f800000))
#define isinf64(x) (!(((*(uint64_t*)&x)&0x7fffffffffffffffl)^0x7ff0000000000000l))
#else
#define isinf32(x) isinf(x)
#define isinf64(x) isinf(x)
#endif

#ifndef isnan
#define isnan32(x) (((*(unsigned int*)&x)&0x007fffff)&&!(((*(unsigned int*)&x)&0x7f800000)^0x7f800000))
#define isnan64(x) (((*(uint64_t*)&x)&0x000fffffffffffffl)&&!(((*(uint64_t*)&x)&0x7ff0000000000000l)^0x7ff0000000000000l))
#else
#define isnan32(x) isnan(x)
#define isnan64(x) isnan(x)
#endif

/** \brief Compare 32 bit IEEE754s */
unsigned int cbf_ULP32(const float a, const float b);


#ifndef NO_UINT64_TYPE

/** \brief Compare 64 bit IEEE754s */
uint64_t cbf_ULP64(const double a, const double b);

#endif

/** \brief Let people find out if the library was compiled with support for the ULP64 function */
int cbf_has_ULP64();

#ifdef __cplusplus

}

#endif

#endif