用numpy打破圆形

Mic*_*ael 8 python numpy rounding scipy

标准的numpy圆形打破遵循IEEE 754惯例,朝着最接近的偶数舍入一半.有没有办法指定不同的舍入行为,例如舍入为零或朝向-inf?我不是在谈论ceil或者地板,我只需要不同的打破领带.

nne*_*neo 10

NumPy不对内部舍入模式进行任何控制.这有两种选择:

  1. 使用gmpy2,如本答案中所述.这使您可以完全控制舍入模式,但使用gmpy2简单的float数学可能比NumPy慢.
  2. 使用fesetroundvia ctypes手动设置舍入模式.这是系统特定的,因为常量可能因平台而异; 检查fenv.h平台上的常量值.在我的机器上(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
    
    Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答!为了完整性:使用linux,我发现fesetround不在libc中,但在libm中,所以加载行是`libm = ctypes.CDLL('libm.so.6')`.常数是相同的. (6认同)