Ниже приведена функция, которая показывает различные скругления квадратных корней для различной точности чисел большого плавания
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 (), чтобы получить правильные значения для различных параметров округления?