LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
shr.c
浏览该文件的文档.
1/**
2 * Copyright (C) 2026 HJimmyK(Jericho Knox)
3 *
4 * This file is part of LAMMP.
5 *
6 * LAMMP is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License (LGPL) as published
8 * by the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed WITHOUT ANY WARRANTY.
12 *
13 * See <https://www.gnu.org/licenses/>.
14 */
15
16#include "../../../../include/lammp/lmmpn.h"
17
18
20 if (shr == 0) {
22 return 0;
23 } else {
25 const mp_size_t rshr = LIMB_BITS - shr;
27 high_limb = *numa++;
28 retval = (high_limb << rshr);
30 while (--na != 0) {
31 high_limb = *numa++;
32 *dst++ = low_limb | (high_limb << rshr);
34 }
35 *dst = low_limb;
36 return retval;
37 }
38}
39
41 if (shr == 0) {
43 return 0;
44 } else {
46 const mp_size_t rshr = LIMB_BITS - shr;
48 high_limb = *numa++;
49 retval = (high_limb << rshr);
51 while (--na != 0) {
52 high_limb = *numa++;
53 *dst++ = low_limb | (high_limb << rshr);
55 }
56 c &= ~(((mp_limb_t)1 << rshr) - 1);
57 *dst = low_limb | c;
58 return retval;
59 }
60}
61
63 mp_size_t i = 0, c = 0, l = 0;
64 mp_limb_t a, b, r;
65
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] = r >> 1;
73 l = r & 1;
74
75 for (i = 1; i < n; i++) {
76 a = numa[i];
77 b = numb[i];
78 r = a + c;
79 c = (r < c);
80 r += b;
81 c += (r < b);
82 dst[i - 1] |= r << (LIMB_BITS - 1);
83 dst[i] = r >> 1;
84 }
85 dst[n - 1] |= c << (LIMB_BITS - 1);
86 return l;
87}
88
90 mp_size_t i = 0, l = 0;
91 mp_limb_t a, b, r;
92
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] = r >> 1;
100 l = r & 1;
101
102 for (i = 1; i < n; i++) {
103 a = numa[i];
104 b = numb[i];
105 r = a + c;
106 c = (r < c);
107 r += b;
108 c += (r < b);
109 dst[i - 1] |= r << (LIMB_BITS - 1);
110 dst[i] = r >> 1;
111 }
112 dst[n - 1] |= c << (LIMB_BITS - 1);
113 return l;
114}
115
117 mp_size_t i = 0, c = 0, l = 0;
118 mp_limb_t a, b, r;
119
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] = r >> 1;
127 l = r & 1;
128
129 for (i = 1; i < n; i++) {
130 a = numa[i];
131 b = numb[i];
132 b += c;
133 c = (b < c);
134 c += (a < b);
135 r = a - b;
136 dst[i - 1] |= r << (LIMB_BITS - 1);
137 dst[i] = r >> 1;
138 }
139 dst[n - 1] |= c << (LIMB_BITS - 1);
140 return l;
141}
142
144 mp_size_t i = 0, l = 0;
145 mp_limb_t a, b, r;
146
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] = r >> 1;
154 l = r & 1;
155
156 for (i = 1; i < n; i++) {
157 a = numa[i];
158 b = numb[i];
159 b += c;
160 c = (b < c);
161 c += (a < b);
162 r = a - b;
163 dst[i - 1] |= r << (LIMB_BITS - 1);
164 dst[i] = r >> 1;
165 }
166 dst[n - 1] |= c << (LIMB_BITS - 1);
167 return l;
168}
#define l
#define c
mp_limb_t * mp_ptr
Definition lmmp.h:80
#define lmmp_copy(dst, src, n)
Definition lmmp.h:367
uint64_t mp_size_t
Definition lmmp.h:77
const mp_limb_t * mp_srcptr
Definition lmmp.h:81
uint64_t mp_limb_t
Definition lmmp.h:76
#define LIMB_BITS
Definition lmmp.h:86
#define numb
#define n
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:89
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:40
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:62
mp_limb_t lmmp_shr_(mp_ptr dst, mp_srcptr numa, mp_size_t na, mp_size_t shr)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition shr.c:19
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:143
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:116