@@ -105,16 +105,17 @@ uvec2 sum_with_carry(uint a, uint b){
105105 res.y = uint(a > res.x || b > res.x);
106106 return res;
107107}
108- number abs_sum(number a, number b){
109- number c = REAL_ZERO;
110- uint carry = 0u;
111- for(int i = 0; i < NUMBER_OF_LIMBS; ++i){
112- uvec2 res = sum_with_carry(sum_with_carry(a.limb[i],b.limb[i]).x,carry);
113- uint sum = res.x;
114- carry = res.y;
115- c.limb[i] = sum;
116- }
117- return c;
108+ number abs_sum(number a, number b) {
109+ number c = null_number();
110+ uint carry = 0u;
111+ for (int i = 0; i < NUMBER_OF_LIMBS; ++i) {
112+ uvec2 step1 = sum_with_carry(a.limb[i], b.limb[i]);
113+ uvec2 step2 = sum_with_carry(step1.x, carry);
114+
115+ c.limb[i] = step2.x;
116+ carry = step1.y + step2.y;
117+ }
118+ return c;
118119}
119120number abs_hp_sub(number a, number b) {
120121 number c = REAL_ZERO;
@@ -278,7 +279,7 @@ uint get_half(number a, int index){
278279 return 0u;
279280 }
280281 uint l = a.limb[index / 2];
281- return uint(index % 2 == 0) * hi (l) + uint(index%2==1) * lo (l);
282+ return uint(index % 2 == 0) * lo (l) + uint(index%2==1) * hi (l);
282283}
283284
284285void set_half(inout number a, int index, uint val) {
@@ -359,7 +360,8 @@ number hp_div(number n, number d) {
359360
360361 if (shift > 0) {
361362 uint carry_shift = 0u;
362- for (int i = 0; i < 25; ++i) {
363+ const int MAX_HALVES = int(NUMBER_OF_LIMBS*2 + FRACTIONAL_SIZE * 2 + 1);
364+ for (int i = 0; i < MAX_HALVES; ++i) {
363365 uint val = (u_halves[i] << shift) | carry_shift;
364366 carry_shift = u_halves[i] >> (16 - shift);
365367 u_halves[i] = val & 0xFFFFu;
@@ -376,14 +378,14 @@ number hp_div(number n, number d) {
376378 for (int j = m; j >= 0; --j) {
377379 uint u_jn = u_halves[j + n_len];
378380 uint u_jn1 = u_halves[j + n_len - 1];
379- uint u_jn2 = (j + n_len >= 2) ? u_halves[j + n_len - 2] : 0u;
381+ uint u_jn2 = (j + n_len >= 2) ? u_halves[j + n_len - 2] : 0u)shdr" R"shdr( ;
380382
381383 uint dividend = (u_jn << 16) | u_jn1;
382384 uint q_hat, r_hat;
383385
384386 if (u_jn == v_n1) {
385387 q_hat = 0xFFFFu;
386- r_hat = u_jn1)shdr" R"shdr( + v_n1;
388+ r_hat = u_jn1 + v_n1;
387389 } else {
388390 q_hat = dividend / v_n1;
389391 r_hat = dividend % v_n1;
@@ -560,7 +562,6 @@ number hp_log(number x){
560562 if (k > 0) m = shift_left(x,-k);
561563 else m = x;
562564
563- number REAL_ONE = REAL_ONE;
564565 number z = hp_div(hp_sub(m,REAL_ONE),hp_add(m,REAL_ONE));
565566 number z_squared = hp_mult(z,z);
566567
@@ -595,7 +596,7 @@ number hp_sqrt(number x){
595596
596597 number n_k_next = REAL_ZERO;
597598
598- for(int i = 0; i < (NUMBER_OF_LIMBS / 23 + 2); ++i){
599+ for(int i = 0; i < (( NUMBER_OF_LIMBS *32) / 23 + 2); ++i){
599600 number div_term = hp_div(x,n_k);
600601 n_k_next = hp_add(n_k,div_term);
601602 n_k_next = shift_right(n_k_next,1);
@@ -699,13 +700,13 @@ number hp_cos(number x) {
699700 term = hp_mult(term, x_sq);
700701
701702 uint divisor = uint(2 * i - 1) * uint(2 * i);
702- term = div_uint(term, divisor );
703+ term = div_uint(term, div )shdr" R"shdr( isor );
703704
704705 if (is_zero(term)) break;
705706
706707 if (i % 2 == 1) {
707708 sum = hp_sub(sum, term);
708- })shdr" R"shdr( else {
709+ } else {
709710 sum = hp_add(sum, term);
710711 }
711712 }
0 commit comments