Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
e0ac194f
Commit
e0ac194f
authored
Dec 31, 2014
by
Damien George
Browse files
py: Fix rshift and not of zero/one edge cases in mpz.
Addresses issue #1027.
parent
816a46a4
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/mpz.c
View file @
e0ac194f
...
...
@@ -871,11 +871,17 @@ void mpz_not_inpl(mpz_t *dest, const mpz_t *z) {
if
(
dest
!=
z
)
{
mpz_set
(
dest
,
z
);
}
if
(
dest
->
neg
)
{
if
(
dest
->
len
==
0
)
{
mpz_need_dig
(
dest
,
1
);
dest
->
dig
[
0
]
=
1
;
dest
->
len
=
1
;
dest
->
neg
=
1
;
}
else
if
(
dest
->
neg
)
{
dest
->
neg
=
0
;
mpz_dig_t
k
=
1
;
dest
->
len
=
mpn_sub
(
dest
->
dig
,
dest
->
dig
,
dest
->
len
,
&
k
,
1
);
}
else
{
mpz_need_dig
(
dest
,
dest
->
len
+
1
);
mpz_dig_t
k
=
1
;
dest
->
len
=
mpn_add
(
dest
->
dig
,
dest
->
dig
,
dest
->
len
,
&
k
,
1
);
dest
->
neg
=
1
;
...
...
@@ -924,7 +930,14 @@ void mpz_shr_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs) {
round_up
=
1
;
}
if
(
round_up
)
{
dest
->
len
=
mpn_add
(
dest
->
dig
,
dest
->
dig
,
dest
->
len
,
&
round_up
,
1
);
if
(
dest
->
len
==
0
)
{
// dest == 0, so need to add 1 by hand (answer will be -1)
dest
->
dig
[
0
]
=
1
;
dest
->
len
=
1
;
}
else
{
// dest > 0, so can use mpn_add to add 1
dest
->
len
=
mpn_add
(
dest
->
dig
,
dest
->
dig
,
dest
->
len
,
&
round_up
,
1
);
}
}
}
}
...
...
tests/basics/int_big_zeroone.py
0 → 100644
View file @
e0ac194f
# test [0,-0,1,-1] edge cases of bignum
long_zero
=
(
2
**
64
)
>>
65
long_neg_zero
=
-
long_zero
long_one
=
long_zero
+
1
long_neg_one
=
-
long_one
cases
=
[
long_zero
,
long_neg_zero
,
long_one
,
long_neg_one
]
print
(
cases
)
print
([
-
c
for
c
in
cases
])
print
([
~
c
for
c
in
cases
])
print
([
c
>>
1
for
c
in
cases
])
print
([
c
<<
1
for
c
in
cases
])
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment