LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
shr.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../../include/lammp/lmmpn.h"
8
10 if (shr == 0) {
11 lmmp_copy(dst, numa, na);
12 return 0;
13 } else {
14 mp_limb_t high_limb, low_limb;
15 const mp_size_t rshr = LIMB_BITS - shr;
16 mp_limb_t retval;
17 high_limb = *numa++;
18 retval = (high_limb << rshr);
19 low_limb = high_limb >> shr;
20 while (--na != 0) {
21 high_limb = *numa++;
22 *dst++ = low_limb | (high_limb << rshr);
23 low_limb = high_limb >> shr;
24 }
25 *dst = low_limb;
26 return retval;
27 }
28}
29
31 if (shr == 0) {
32 lmmp_copy(dst, numa, na);
33 return 0;
34 } else {
35 mp_limb_t high_limb, low_limb;
36 const mp_size_t rshr = LIMB_BITS - shr;
37 mp_limb_t retval;
38 high_limb = *numa++;
39 retval = (high_limb << rshr);
40 low_limb = high_limb >> shr;
41 while (--na != 0) {
42 high_limb = *numa++;
43 *dst++ = low_limb | (high_limb << rshr);
44 low_limb = high_limb >> shr;
45 }
46 c &= ~(((mp_limb_t)1 << rshr) - 1);
47 *dst = low_limb | c;
48 return retval;
49 }
50}
51
53 mp_size_t i = 0, c = 0, l = 0;
54 mp_limb_t a, b, r;
55
56 a = numa[i];
57 b = numb[i];
58 r = a + c;
59 c = (r < c);
60 r += b;
61 c += (r < b);
62 dst[i] = r >> 1;
63 l = r & 1;
64
65 for (i = 1; i < n; i++) {
66 a = numa[i];
67 b = numb[i];
68 r = a + c;
69 c = (r < c);
70 r += b;
71 c += (r < b);
72 dst[i - 1] |= r << (LIMB_BITS - 1);
73 dst[i] = r >> 1;
74 }
75 dst[n - 1] |= c << (LIMB_BITS - 1);
76 return l;
77}
78
80 mp_size_t i = 0, l = 0;
81 mp_limb_t a, b, r;
82
83 a = numa[i];
84 b = numb[i];
85 r = a + c;
86 c = (r < c);
87 r += b;
88 c += (r < b);
89 dst[i] = r >> 1;
90 l = r & 1;
91
92 for (i = 1; i < n; i++) {
93 a = numa[i];
94 b = numb[i];
95 r = a + c;
96 c = (r < c);
97 r += b;
98 c += (r < b);
99 dst[i - 1] |= r << (LIMB_BITS - 1);
100 dst[i] = r >> 1;
101 }
102 dst[n - 1] |= c << (LIMB_BITS - 1);
103 return l;
104}
105
107 mp_size_t i = 0, c = 0, l = 0;
108 mp_limb_t a, b, r;
109
110 a = numa[i];
111 b = numb[i];
112 b += c;
113 c = (b < c);
114 c += (a < b);
115 r = a - b;
116 dst[i] = r >> 1;
117 l = r & 1;
118
119 for (i = 1; i < n; i++) {
120 a = numa[i];
121 b = numb[i];
122 b += c;
123 c = (b < c);
124 c += (a < b);
125 r = a - b;
126 dst[i - 1] |= r << (LIMB_BITS - 1);
127 dst[i] = r >> 1;
128 }
129 dst[n - 1] |= c << (LIMB_BITS - 1);
130 return l;
131}
132
134 mp_size_t i = 0, l = 0;
135 mp_limb_t a, b, r;
136
137 a = numa[i];
138 b = numb[i];
139 b += c;
140 c = (b < c);
141 c += (a < b);
142 r = a - b;
143 dst[i] = r >> 1;
144 l = r & 1;
145
146 for (i = 1; i < n; i++) {
147 a = numa[i];
148 b = numb[i];
149 b += c;
150 c = (b < c);
151 c += (a < b);
152 r = a - b;
153 dst[i - 1] |= r << (LIMB_BITS - 1);
154 dst[i] = r >> 1;
155 }
156 dst[n - 1] |= c << (LIMB_BITS - 1);
157 return l;
158}
mp_limb_t * mp_ptr
Definition lmmp.h:215
#define lmmp_copy(dst, src, n)
Definition lmmp.h:364
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define LIMB_BITS
Definition lmmp.h:221
mp_limb_t lmmp_shr1add_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带进位加法后右移1位 [dst,n] = ([numa,n] + [numb,n] + c) >> 1
Definition shr.c:79
mp_limb_t lmmp_shr_c_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr, mp_limb_t c)
带进位的大数右移操作 [dst,na] = [numa,na]>>shr,dst的高shr位填充c的高shr位
Definition shr.c:30
mp_limb_t lmmp_shr1add_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
加法后右移1位 [dst,n] = ([numa,n] + [numb,n]) >> 1
Definition shr.c:52
mp_limb_t lmmp_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
大数右移操作 [dst,na] = [numa,na] >> shr,dst的高shr位填充0
Definition shr.c:9
mp_limb_t lmmp_shr1sub_nc_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n, mp_limb_t c)
带借位减法后右移1位 [dst,n] = ([numa,n] - [numb,n] - c) >> 1
Definition shr.c:133
mp_limb_t lmmp_shr1sub_n_(mp_ptr dst, mp_srcptr numa, mp_srcptr numb, mp_size_t n)
减法后右移1位 [dst,n] = ([numa,n] - [numb,n]) >> 1
Definition shr.c:106