-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathBigFloat.h
More file actions
46 lines (37 loc) · 1.31 KB
/
Copy pathBigFloat.h
File metadata and controls
46 lines (37 loc) · 1.31 KB
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
#pragma once
#include <stdint.h>
#include <string>
#include <memory>
#define YCL_BIGFLOAT_EXTRA_PRECISION 2
class BigFloat {
public:
BigFloat(BigFloat&& x);
BigFloat(const BigFloat& x);
BigFloat& operator=(BigFloat&& x);
BigFloat& operator=(const BigFloat& x);
BigFloat();
BigFloat(uint32_t x, bool sign = true);
std::string to_string_dec(size_t digits = 0) const;
std::string to_string_hex(size_t digits = 0) const;
size_t get_precision() const { return L; }
int64_t get_exponent() const { return exp; }
uint32_t word_at(int64_t mag) const;
void negate();
BigFloat mul(uint32_t x) const;
BigFloat add(const BigFloat& x, size_t p = 0) const;
BigFloat sub(const BigFloat& x, size_t p = 0) const;
BigFloat mul(const BigFloat& x, size_t p = 0, int threads=1) const;
BigFloat rcp(size_t p, int threads=1) const;
BigFloat div(const BigFloat& x, size_t p, int threads=1) const;
private:
bool sign; // true = positive or zero, false = negative
int64_t exp; // Exponent
size_t L; // Length
std::unique_ptr<uint32_t[]> T;
// Internal helpers
int ucmp(const BigFloat& x) const;
BigFloat uadd(const BigFloat& x, size_t p) const;
BigFloat usub(const BigFloat& x, size_t p) const;
friend BigFloat invsqrt(uint32_t x, size_t p, int threads);
};
BigFloat invsqrt(uint32_t x, size_t p, int threads=1);