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
56402796
Commit
56402796
authored
Mar 22, 2014
by
Rachel Dowdall
Browse files
Fixed floor division on mp ints and small ints. Added a floordivide test case.
parent
cde8631f
Changes
5
Show whitespace changes
Inline
Side-by-side
py/compile.c
View file @
56402796
...
...
@@ -3,6 +3,7 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include "misc.h"
#include "mpconfig.h"
...
...
@@ -141,12 +142,13 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_SLASH
))
{
;
// pass
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_PERCENT
))
{
// XXX implement this properly as Python's % operator acts differently to C's
//pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT, arg0 % arg1);
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
python_modulo
(
arg0
,
arg1
));
}
else
if
(
MP_PARSE_NODE_IS_TOKEN_KIND
(
pns
->
nodes
[
1
],
MP_TOKEN_OP_DBL_SLASH
))
{
// XXX implement this properly as Python's // operator acts differently to C's
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
arg0
/
arg1
);
//pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT,
// floor((mp_float_t)arg0 / arg1));
pn
=
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
python_floor_divide
(
arg0
,
arg1
));
}
else
{
// shouldn't happen
assert
(
0
);
...
...
py/objint_mpz.c
View file @
56402796
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include "nlr.h"
#include "misc.h"
...
...
@@ -97,6 +98,12 @@ mp_obj_t int_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
case
RT_BINARY_OP_INPLACE_FLOOR_DIVIDE
:
{
mpz_t
rem
;
mpz_init_zero
(
&
rem
);
mpz_divmod_inpl
(
&
res
->
mpz
,
&
rem
,
zlhs
,
zrhs
);
if
(
zlhs
->
neg
!=
zrhs
->
neg
)
{
if
(
!
mpz_is_zero
(
&
rem
))
{
mpz_t
mpzone
;
mpz_init_from_int
(
&
mpzone
,
-
1
);
mpz_add_inpl
(
&
res
->
mpz
,
&
res
->
mpz
,
&
mpzone
);
}
}
mpz_deinit
(
&
rem
);
break
;
}
...
...
py/runtime.c
View file @
56402796
...
...
@@ -5,6 +5,7 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include "nlr.h"
#include "misc.h"
...
...
@@ -661,7 +662,11 @@ mp_obj_t rt_binary_op(int op, mp_obj_t lhs, mp_obj_t rhs) {
break
;
}
case
RT_BINARY_OP_FLOOR_DIVIDE
:
case
RT_BINARY_OP_INPLACE_FLOOR_DIVIDE
:
lhs_val
/=
rhs_val
;
break
;
case
RT_BINARY_OP_INPLACE_FLOOR_DIVIDE
:
{
lhs_val
=
python_floor_divide
(
lhs_val
,
rhs_val
);
break
;
}
#if MICROPY_ENABLE_FLOAT
case
RT_BINARY_OP_TRUE_DIVIDE
:
case
RT_BINARY_OP_INPLACE_TRUE_DIVIDE
:
return
mp_obj_new_float
((
mp_float_t
)
lhs_val
/
(
mp_float_t
)
rhs_val
);
...
...
tests/basics/floordivide.py
0 → 100644
View file @
56402796
# check modulo matches python definition
# This tests compiler version
print
(
123
//
7
)
print
(
-
123
//
7
)
print
(
123
//
-
7
)
print
(
-
123
//
-
7
)
a
=
10000001
b
=
10000000
print
(
a
//
b
)
print
(
a
//
-
b
)
print
(
-
a
//
b
)
print
(
-
a
//
-
b
)
if
True
:
a
=
987654321987987987987987987987
b
=
19
print
(
a
//
b
)
print
(
a
//
-
b
)
print
(
-
a
//
b
)
print
(
-
a
//
-
b
)
a
=
10000000000000000000000000000000000000000000
b
=
100
print
(
a
//
b
)
print
(
a
//
-
b
)
print
(
-
a
//
b
)
print
(
-
a
//
-
b
)
tests/basics/modulo.py
View file @
56402796
# check modulo matches python definition
# This test compiler version
print
(
123
%
7
)
print
(
-
123
%
7
)
print
(
123
%
-
7
)
...
...
@@ -7,7 +7,6 @@ print(-123 % -7)
a
=
321
b
=
19
print
(
a
%
b
)
print
(
a
%
-
b
)
print
(
-
a
%
b
)
...
...
@@ -21,3 +20,17 @@ print(a % b)
print
(
a
%
-
b
)
print
(
-
a
%
b
)
print
(
-
a
%
-
b
)
if
False
:
print
(
1.23456
%
0.7
)
print
(
-
1.23456
%
0.7
)
print
(
1.23456
%
-
0.7
)
print
(
-
1.23456
%
-
0.7
)
a
=
1.23456
b
=
0.7
print
(
a
%
b
)
print
(
a
%
-
b
)
print
(
-
a
%
b
)
print
(
-
a
%
-
b
)
Write
Preview
Markdown
is supported
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