Преобразование из MPF в Sympy Float без потери точности

Есть какой-либо способ сделать это? Например, в приведенном ниже коде я теряю точность:

>>> from sympy import *
>>> from sympy.mpmath import *
>>> mp.dps = 50
>>> a = mpf('1.0')/mpf('3.0')
>>> a
mpf('0.33333333333333333333333333333333333333333333333333311')
>>> b = Float(a,50)
>>> b
0.33333333333333331482961625624739099293947219848633

person Jibbity jobby    schedule 06.05.2016    source источник
comment
Какая у вас версия SymPy? Когда я запускаю тот же тест, я не вижу потери точности.   -  person user2357112 supports Monica    schedule 07.05.2016
comment
Я тестировал на 0.7.2, но похоже должно работать и на 0.7.6. Вы уверены, что правильно установили точность для всех операций? Попробуйте протестировать его еще раз, с операциями в точном порядке, в котором они указаны в вашем вопросе.   -  person user2357112 supports Monica    schedule 07.05.2016
comment
Я попробовал еще раз с тем же результатом. То, что вы видите выше, это копипаст.   -  person Jibbity jobby    schedule 07.05.2016


Ответы (2)


Преобразование в строку сначала, кажется, помогает:

>>> from sympy import *
>>> from sympy.mpmath import *
>>> mp.dps = 50
>>> a = mpf('1.0')/mpf('3.0')
>>> a
mpf('0.33333333333333333333333333333333333333333333333333311')
>>> b = Float(a,50)
>>> b
0.33333333333333331482961625624739099293947219848633
>>> b = Float(str(a),50)
>>> b
0.33333333333333333333333333333333333333333333333333
person Jibbity jobby    schedule 06.05.2016

sympify(a) поступает правильно. Float(a) тоже должен работать, но, похоже, есть ошибка.

person asmeurer    schedule 09.05.2016
comment
Я считаю, что это также симпифицирует потерю точности. - person Jibbity jobby; 09.05.2016
comment
Убедитесь, что вы используете SymPy 1.0. Похоже, это было исправлено в том выпуске. - person asmeurer; 09.05.2016