From: Robert Bradshaw Date: Sat, 27 Sep 2008 20:52:44 +0000 (-0700) Subject: Implement mod for floats. X-Git-Tag: 0.9.9.2.beta~82 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=28b719dde7c74a452ea229b030c4fb42b9ebe00d;p=cython.git Implement mod for floats. --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 733124db..bcd29039 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3414,22 +3414,27 @@ class FloorDivNode(NumBinopNode): self.operand2.result()) -class ModNode(IntBinopNode): +class ModNode(NumBinopNode): # '%' operator. def is_py_operation(self): return (self.operand1.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): # '**' operator. - def analyse_types(self, env): - env.pow_function_used = 1 - NumBinopNode.analyse_types(self, env) - def compute_c_result_type(self, type1, type2): if self.c_types_okay(type1, type2): return PyrexTypes.c_double_type diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index 127d7c24..35ce1c17 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -167,7 +167,6 @@ class Scope: # temp_counter integer Counter for naming temp vars # cname_to_entry {string : 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 # is_py_class_scope boolean Is a Python class scope # is_c_class_scope boolean Is an extension type scope @@ -221,7 +220,6 @@ class Scope: #self.pending_temp_entries = [] # TEMPORARY self.temp_counter = 1 self.cname_to_entry = {} - self.pow_function_used = 0 self.string_to_entry = {} self.identifier_to_entry = {} self.num_to_entry = {} @@ -637,8 +635,6 @@ class Scope: def generate_library_function_declarations(self, code): # 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 def defines_any(self, names): diff --git a/tests/errors/e_modop.pyx b/tests/errors/e_modop.pyx deleted file mode 100644 index 926c3fb9..00000000 --- a/tests/errors/e_modop.pyx +++ /dev/null @@ -1,6 +0,0 @@ -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) -""" diff --git a/tests/run/fmod.pyx b/tests/run/fmod.pyx new file mode 100644 index 00000000..0bbd76b8 --- /dev/null +++ b/tests/run/fmod.pyx @@ -0,0 +1,7 @@ +__doc__ = """ + >>> fmod(7, 1.25) + 0.75 +""" + +def fmod(double a, double b): + return a % b