forked from ish-app/ish
-
Notifications
You must be signed in to change notification settings - Fork 0
/
float80.h
59 lines (47 loc) · 1.37 KB
/
float80.h
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
#ifndef FLOAT80_H
#define FLOAT80_H
#include <stdint.h>
#include <stdbool.h>
typedef struct {
uint64_t signif;
union {
uint16_t signExp;
struct {
unsigned exp:15;
unsigned sign:1;
};
};
} float80;
float80 f80_from_int(int64_t i);
int64_t f80_to_int(float80 f);
float80 f80_from_double(double d);
double f80_to_double(float80 f);
bool f80_isnan(float80 f);
bool f80_isinf(float80 f);
bool f80_iszero(float80 f);
bool f80_isdenormal(float80 f);
bool f80_is_supported(float80 f);
float80 f80_add(float80 a, float80 b);
float80 f80_sub(float80 a, float80 b);
float80 f80_mul(float80 a, float80 b);
float80 f80_div(float80 a, float80 b);
float80 f80_mod(float80 a, float80 b);
float80 f80_rem(float80 a, float80 b);
bool f80_lt(float80 a, float80 b);
bool f80_eq(float80 a, float80 b);
bool f80_uncomparable(float80 a, float80 b);
float80 f80_neg(float80 f);
float80 f80_abs(float80 f);
float80 f80_log2(float80 x);
float80 f80_sqrt(float80 x);
float80 f80_scale(float80 x, int scale);
enum f80_rounding_mode {
round_to_nearest = 0,
round_down = 1,
round_up = 2,
round_chop = 3,
};
extern __thread enum f80_rounding_mode f80_rounding_mode;
#define F80_NAN ((float80) {.signif = 0xc000000000000000, .exp = 0x7fff, .sign = 0})
#define F80_INF ((float80) {.signif = 0x8000000000000000, .exp = 0x7fff, .sign = 0})
#endif