I'm not sure it matters in the end, but it looks like 
Mod(Rational(15,7),1).n() works ok too.  I think what's happening is that 
when pi isn't in the argument list, it basically gets simplified when the 
class construction calls Mod.eval but Mod.eval doesn't know how to simplify 
with pi.

I've patched this into my Mod class:

    def _eval_evalf(self,prec):
        return N(mpmath.fmod(*[N(x,prec) for x in self.args]),prec)

It solves my immediate problem, but given how complex the evalf functions 
are for everything else, I get the feeling I've done something horribly, 
inexcusably naive here.  Am I missing anything?

I tried Chris' examples and Mod(1e-40,1) returns 0 with my method even 
though mpmath.fmod(1e-40,1) returns 1e-40.  It also returns zero if I write 
it as Mod(Float(1e-40),S(1)).  I get the proper results with 
Mod(1e-40,1,evaluate=False).n().  

Again, the problem appears to be in Mod.eval, but I'm not sure where. 

The other thing I noticed going through EvalfMixin.evalf is that the 
options parameter isn't passed to self._eval_evalf, which means that subs 
parameters won't get passed unless _eval_evalf is in the evalf_table.  I 
don't know if this was intentional or an oversight.

Cheers--
 Greg



On Wednesday, February 27, 2013 3:40:57 PM UTC-8, Aaron Meurer wrote:
>
> On Wed, Feb 27, 2013 at 1:41 PM, Chris Smith <[email protected]<javascript:>> 
> wrote: 
> >> It looks like Mod doesn't implement evalf at all, and it doesn't work 
> >> automatically (that only happens if the function name is the same as 
> >> the mpmath function name).  It should be easy.  Just evaluate the 
> >> arguments, and then take the mod of them. 
> > 
> > In general this is not going to work: 
> > 
> > ``` 
> >>>> Mod(1e-30,3) 
> > 1.00000000000000e-30 
> >>>> Mod(1e-40,3) 
> > 0.0 
> > ``` 
> > 
> > whereas 
> > 
> > ``` 
> >>>> 1e-40 % 3 
> > 9.9999999999999993e-41 
> > ``` 
>
> Isn't that just a roundoff error. If you use Float, you get 1e-40. 
>
> Aaron Meurer 
>
> > 
> > Something like this might work when a > b (when a < b the answer is 
> `a`): 
> > 
> > ``` 
> >>>> a,b=pi**3,S(3) 
> >>>> (a - round(a/b)*b).n() 
> > 1.00627668029982 
> >>>> a.n() % b.n() 
> > 1.00627668029982 
> > ``` 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups "sympy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an email to [email protected] <javascript:>. 
> > To post to this group, send email to [email protected]<javascript:>. 
>
> > Visit this group at http://groups.google.com/group/sympy?hl=en. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
> > 
> > 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to