-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbn_fix.c
88 lines (77 loc) · 1.94 KB
/
bn_fix.c
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* bn_fix.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: Kashnitskiy <elijahkash.code@gmail.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/09/30 18:41:50 by odrinkwa #+# #+# */
/* Updated: 2020/01/16 13:57:47 by Kashnitskiy ### ########.fr */
/* */
/* ************************************************************************** */
#include <prf_double.h>
void fixsize_bignum(t_bignum *bn)
{
int i;
i = bn->maxsize - 1;
while (i >= 0)
{
if (bn->number[i] != 0)
break ;
i--;
}
bn->size = i + 1;
}
void fixup_bignum(t_bignum *bn)
{
int i;
i = 0;
while (i < bn->maxsize - 1)
{
bn->number[i + 1] += bn->number[i] / BASE_BN;
bn->number[i] = bn->number[i] % BASE_BN;
i++;
}
fixzero_bignum(bn);
}
void fixzero_bignum(t_bignum *bn)
{
int i;
i = 0;
while (i < bn->maxsize)
{
if (bn->number[i] != 0)
return ;
i++;
}
bn->size = 0;
}
void fixdown_bignum(t_bignum *bn)
{
int i;
i = 0;
while (i < bn->maxsize - 1)
{
while (bn->number[i] < 0)
{
bn->number[i] += BASE_BN;
bn->number[i + 1] -= 1;
}
i++;
}
fixzero_bignum(bn);
fixsize_bignum(bn);
}
void makebnwithfract(t_bignum *res, t_bigdec bd)
{
t_bignum ten;
ft_deepcopy_bignum(res, bd.intpart);
res->exp = bd.sizefract;
res->sign = bd.sign;
if (bd.sizefract != 0)
{
ft_put_one_inpos_bignum(&ten, res->maxsize, bd.sizefract + 1);
ft_imul_bignum(res, ten);
ft_isumabs_bignum(res, bd.fractpart);
}
}