Commit 28b719dd authored by Robert Bradshaw's avatar Robert Bradshaw

Implement mod for floats.

parent b0a706e6
...@@ -3414,22 +3414,27 @@ class FloorDivNode(NumBinopNode): ...@@ -3414,22 +3414,27 @@ class FloorDivNode(NumBinopNode):
self.operand2.result()) self.operand2.result())
class ModNode(IntBinopNode): class ModNode(NumBinopNode):
# '%' operator. # '%' operator.
def is_py_operation(self): def is_py_operation(self):
return (self.operand1.type.is_string return (self.operand1.type.is_string
or self.operand2.type.is_string or self.operand2.type.is_string
or IntBinopNode.is_py_operation(self)) or NumBinopNode.is_py_operation(self))
def calculate_result_code(self):
if self.operand1.type.is_float or self.operand2.type.is_float:
return "fmod(%s, %s)" % (
self.operand1.result(),
self.operand2.result())
else:
return "(%s %% %s)" % (
self.operand1.result(),
self.operand2.result())
class PowNode(NumBinopNode): class PowNode(NumBinopNode):
# '**' operator. # '**' operator.
def analyse_types(self, env):
env.pow_function_used = 1
NumBinopNode.analyse_types(self, env)
def compute_c_result_type(self, type1, type2): def compute_c_result_type(self, type1, type2):
if self.c_types_okay(type1, type2): if self.c_types_okay(type1, type2):
return PyrexTypes.c_double_type return PyrexTypes.c_double_type
......
...@@ -167,7 +167,6 @@ class Scope: ...@@ -167,7 +167,6 @@ class Scope:
# temp_counter integer Counter for naming temp vars # temp_counter integer Counter for naming temp vars
# cname_to_entry {string : Entry} Temp cname to entry mapping # cname_to_entry {string : Entry} Temp cname to entry mapping
# int_to_entry {int : Entry} Temp cname to entry mapping # int_to_entry {int : Entry} Temp cname to entry mapping
# pow_function_used boolean The C pow() function is used
# return_type PyrexType or None Return type of function owning scope # return_type PyrexType or None Return type of function owning scope
# is_py_class_scope boolean Is a Python class scope # is_py_class_scope boolean Is a Python class scope
# is_c_class_scope boolean Is an extension type scope # is_c_class_scope boolean Is an extension type scope
...@@ -221,7 +220,6 @@ class Scope: ...@@ -221,7 +220,6 @@ class Scope:
#self.pending_temp_entries = [] # TEMPORARY #self.pending_temp_entries = [] # TEMPORARY
self.temp_counter = 1 self.temp_counter = 1
self.cname_to_entry = {} self.cname_to_entry = {}
self.pow_function_used = 0
self.string_to_entry = {} self.string_to_entry = {}
self.identifier_to_entry = {} self.identifier_to_entry = {}
self.num_to_entry = {} self.num_to_entry = {}
...@@ -637,8 +635,6 @@ class Scope: ...@@ -637,8 +635,6 @@ class Scope:
def generate_library_function_declarations(self, code): def generate_library_function_declarations(self, code):
# Generate extern decls for C library funcs used. # Generate extern decls for C library funcs used.
#if self.pow_function_used:
# code.putln("%s double pow(double, double);" % Naming.extern_c_macro)
pass pass
def defines_any(self, names): def defines_any(self, names):
......
def f():
cdef float flt1, flt2, flt3
flt1 = flt2 % flt3 # error
_ERRORS = u"""
/Local/Projects/D/Pyrex/Source/Tests/Errors2/e_modop.pyx:3:13: Invalid operand types for '%' (float; float)
"""
__doc__ = """
>>> fmod(7, 1.25)
0.75
"""
def fmod(double a, double b):
return a % b
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment