Python 用numpy断开圆的结

Python 用numpy断开圆的结,python,numpy,scipy,rounding,Python,Numpy,Scipy,Rounding,标准的numpy圆形接头断裂遵循IEEE 754公约,将半个接头向最近的偶数方向四舍五入。是否有方法指定不同的舍入行为,例如向零舍入或向-inf舍入?我不是说天花板或地板,我只是需要不同的打破领带。NumPy不提供任何内部取整模式的控制。这里有两种选择: 如中所述,使用gmpy2。这使您可以完全控制舍入模式,但使用gmpy2进行简单浮点运算可能比NumPy慢 通过ctypes使用fesetround手动设置舍入模式。这是特定于系统的,因为常数可能因平台而异;检查平台上的常量值。在我的计算机(Ma

标准的numpy圆形接头断裂遵循IEEE 754公约,将半个接头向最近的偶数方向四舍五入。是否有方法指定不同的舍入行为,例如向零舍入或向-inf舍入?我不是说天花板或地板,我只是需要不同的打破领带。

NumPy不提供任何内部取整模式的控制。这里有两种选择:

  • 如中所述,使用
    gmpy2
    。这使您可以完全控制舍入模式,但使用
    gmpy2
    进行简单浮点运算可能比NumPy慢
  • 通过
    ctypes
    使用
    fesetround
    手动设置舍入模式。这是特定于系统的,因为常数可能因平台而异;检查平台上的常量值。在我的计算机(Mac OS X)上:

    将numpy导入为np
    导入ctypes
    FE_TONEAREST=0x0000
    FE_向下=0x0400
    FE_向上=0x0800
    FE_指向零=0x0c00
    libc=ctypes.CDLL('libc.dylib')
    v=1(1)使用开源软件SWIG
    为了完成NNONNEO的回答,如果您不想下载像gmpy2这样的大软件包,也不想使用带有ctypes的系统特定代码,那么您可以使用C与SWIG的绑定(假设您的计算机上已经有了它)

    以下是您需要执行的操作(分为四个步骤):

    1) 首先写一个名为rounding的文件。i:

    %module rounding
    %{
    /* Put header files here or function declarations like below */
    
     void rnd_arr();
     void rnd_zero();
     void rnd_plinf();
     void rnd_moinf();
     void rnd_switch();
    %}
    
    extern  void rnd_arr();
    extern  void rnd_zero();
    extern  void rnd_plinf();
    extern  void rnd_moinf();
    extern  void rnd_switch();
    
    2) 然后,文件rnd_C.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #include <fenv.h>
    
    
    void rnd_arr()
    {
      fesetround(FE_TONEAREST);
    }
    
    
    void rnd_zero()
    {
      fesetround(FE_TOWARDZERO);
    }
    
    void rnd_plinf()
    {
      fesetround(FE_UPWARD);
    }
    
    void rnd_moinf()
    {
      fesetround(FE_DOWNWARD);
    }
    
    void rnd_switch()
    {
      int r=fegetround();
    
      if (r==FE_UPWARD)
        r=FE_DOWNWARD;
      else 
        if (r==FE_DOWNWARD)
          r=FE_UPWARD;
        else fprintf(stderr,"ERROR ROUDING MODE \n");
      fesetround(r);
    }
    
    4) 导入库_rounding.com,这样您就可以通过在python文件的开头单击来创建:

    from your_path_to_rounding.so import rounding 
    

    出于好奇,这些打破平局的规则如何在实践中变得相关?毕竟,差异与量化误差在同一数量级。我正在用python从matlab重建一些复杂的计算。这里的情况不同,所以当我比较结果时,它会破坏一些测试用例。谢谢你的回答!为了完整性:使用linux,我发现fesetround不是在libc中,而是在libm中,因此加载行是
    libm=ctypes.CDLL('libm.so.6')
    。常量是一样的。从
    行的
    是不对的:它不应该只是
    导入舍入
    ?它对我来说“从你的路径到舍入。所以导入舍入”很有效,我不知道如何处理你的,抱歉..等等,你一定是指从目录导入舍入的
    。我以为你包括了文件名。
    
    swig -c++ -python -o rounding_wrap.cpp rounding.i
    g++ -fPIC -c rounding_wrap.cpp rnd_C.cpp -I/usr/include/python2.7
    g++ -shared rounding_wrap.o rnd_C.o -o _rounding.so
    
    from your_path_to_rounding.so import rounding