如何创建一个通用的python函数来显示具有不同舍入选项的表达式的bigfloat值

2024-06-12 02:20:53 发布

您现在位置: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()以获得不同舍入选项的正确值


Tags: theinsqrtprecisionprintprecisbfsetcontext