Как создать обобщенную функцию Python для отображения значений выражений bigfloat с различными параметрами округления
Ниже приведена функция, которая показывает различные округления квадратных корней для различной точности чисел с большим числом смещений.
import bigfloat
def sqrts(n,precis):
bigfloat.setcontext(bigfloat.precision(precis)) # set precision for the duration of the function
bigfloat.setcontext(bigfloat.RoundTiesToEven)
print(bigfloat.sqrt(n)," RoundTiesToEven")
bigfloat.setcontext(bigfloat.RoundTowardNegative)
print(bigfloat.sqrt(n)," RoundTowardNegative")
bigfloat.setcontext(bigfloat.RoundTowardZero)
print(bigfloat.sqrt(n)," RoundTowardZero")
bigfloat.setcontext(bigfloat.RoundAwayFromZero)
print(bigfloat.sqrt(n)," RoundAwayFromNegative")
bigfloat.setcontext(bigfloat.RoundTowardPositive)
print(bigfloat.sqrt(n)," RoundTowardPositive")
Кажется, работает как задумано. Например
In [5]: sqrts(2,200)
1.4142135623730950488016887242096980785696718753769480731766796 RoundTiesToEven
1.4142135623730950488016887242096980785696718753769480731766796 RoundTowardNegative
1.4142135623730950488016887242096980785696718753769480731766796 RoundTowardZero
1.4142135623730950488016887242096980785696718753769480731766809 RoundAwayFromNegative
1.4142135623730950488016887242096980785696718753769480731766809 RoundTowardPositive
Ниже приведен обобщенный вариант вышеприведенного, в котором делается попытка показать округления более широкого класса выражений для различной точности.
import bigfloat
def bf(n,precis):
bigfloat.setcontext(bigfloat.precision(precis)) # set precision for the duration of the function
bigfloat.setcontext(bigfloat.RoundTiesToEven)
print(bigfloat.BigFloat(n)," RoundTiesToEven")
bigfloat.setcontext(bigfloat.RoundTowardNegative)
print(bigfloat.BigFloat(n)," RoundTowardNegative")
bigfloat.setcontext(bigfloat.RoundTowardZero)
print(bigfloat.BigFloat(n)," RoundTowardZero")
bigfloat.setcontext(bigfloat.RoundAwayFromZero)
print(bigfloat.BigFloat(n)," RoundAwayFromNegative")
bigfloat.setcontext(bigfloat.RoundTowardPositive)
print(bigfloat.BigFloat(n)," RoundTowardPositive")
Но что-то не так, поскольку разные варианты округления дают одинаковые значения. Например
In [15]: bf(bigfloat.sqrt(2),200)
1.4142135623730950488016887242096980785696718753769480731766809 RoundTiesToEven
1.4142135623730950488016887242096980785696718753769480731766809 RoundTowardNegative
1.4142135623730950488016887242096980785696718753769480731766809 RoundTowardZero
1.4142135623730950488016887242096980785696718753769480731766809 RoundAwayFromNegative
1.4142135623730950488016887242096980785696718753769480731766809 RoundTowardPositive
а также
In [16]: bf(bigfloat.log(2),200)
0.69314718055994530941723212145817656807550013436025525412068060 RoundTiesToEven
0.69314718055994530941723212145817656807550013436025525412068060 RoundTowardNegative
0.69314718055994530941723212145817656807550013436025525412068060 RoundTowardZero
0.69314718055994530941723212145817656807550013436025525412068060 RoundAwayFromNegative
0.69314718055994530941723212145817656807550013436025525412068060 RoundTowardPositive
Как можно исправить bf(), чтобы получить правильные значения для различных опций округления?