Как создать обобщенную функцию Python для отображения значений выражений bigfloat с различными параметрами округления - PullRequest
0 голосов
/ 05 мая 2019

Ниже приведена функция, которая показывает различные скругления квадратных корней для различной точности чисел большого плавания

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

...