Le 28/10/2012 12:49, serge Guelton a écrit :
On Sun, Oct 28, 2012 at 11:19:29AM +0100, Brunet Pierrick wrote:Le 28/10/2012 09:27, serge Guelton a écrit :On Sat, Oct 27, 2012 at 11:56:21PM +0200, serge Guelton wrote:Does it mean we have to make all arguments assignable ?The problem is not with assignable. For now, when we have a __gmp_expr<T,G>, Assignable say : "ho, I have a specialisation which say it is a mpz_class" but in fact, is is not really a mpz_class. It is for exemple a __gmp_expr<mpz_struct, gmp_binary<__gmp_expr<mpz_struct,mpz_struct>,double,binary_plus> > or something like this. As you can see, in fact this is the result of an addition between a double and a mpz_class and it should be a mpf_class because we can see a double in this expression. But it should be more complicated otherwise gmp developper may have fix this problem isn't it?OK I got it. Pythran cast the result to long and python to float, because we do not try to expand the __gmp_expr...Or __gmp_resolve_expr __gmp_resolve_temp ...Looking at this, it seems to solve at least a part of the issue. We will just need to specify __gmp_binary_...<>. For example: __gmp_binary_op<mpz_class,double,...> type is mpf_class as here is a double. This specification isn't in gmpxx.h AFAIK. To use all of these features, I will first need to convert python float to pythran mpf_class as we doesn't have big floating point number in pythran.In : a=11111111111111111111111111L In : b=a+0.5 In : b-a Out: 0.0 In : type(b) Out: float
I did some work about typing today and we have a correct type management. I mean type declaration are correct for example:
mpz_class + double = double. BUT, it doesn't really work as we can see: #export pythran test(long) def test(a): return a + 0.5with a + 0.5, the return type is double and it is correct but (a + 0.5) result is __gmp_expr<mpz_struct , __gmp_binary_expr<mpz_class, double, gmp_binary_plus> > and we can't converte it to double.
I think we have two solutions:using mpf_class as __gmp_expr<mpz_struct , __gmp_binary_expr<mpz_class, double, gmp_binary_plus> > can be cast to mpf_class and then convert it to double
ORfind a solution to write a.get_d() instead of a. The result will be correct in this case as we just add 2 double value.
I thins the second one is the best one but I will wait another day before working on it.