Tie breaking of round with numpy

后端 未结 2 1958
臣服心动
臣服心动 2020-12-10 05:58

Standard numpy round tie breaking is following IEEE 754 convention, to round half towards the nearest even number. Is there a way to specify different rounding behavior, e.g

2条回答
  •  爱一瞬间的悲伤
    2020-12-10 06:10

    NumPy doesn't give any control over the internal rounding mode. Here's two alternatives:

    1. Use gmpy2, as outlined in this answer. This gives you full control over the rounding mode, but using gmpy2 for simple float math is likely to be slower than NumPy.
    2. Use fesetround via ctypes to manually set the rounding mode. This is system-specific because the constants may vary by platform; check fenv.h for the constant values on your platform. On my machine (Mac OS X):

      import numpy as np
      import ctypes
      FE_TONEAREST = 0x0000
      FE_DOWNWARD = 0x0400
      FE_UPWARD = 0x0800
      FE_TOWARDZERO = 0x0c00
      libc = ctypes.CDLL('libc.dylib')
      
      v = 1. / (1<<23)
      print repr(np.float32(1+v) - np.float32(v/2)) # prints 1.0
      libc.fesetround(FE_UPWARD)
      print repr(np.float32(1+v) - np.float32(v/2)) # prints 1.0000002
      

提交回复
热议问题