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

0 ответов

Другие вопросы по тегам