获得e值的最快方法是什么?

时间:2017-12-05 23:40:56

标签: algorithm optimization language-agnostic

什么是最优化的算法,以中等精度找到e的值?

我正在寻找优化方法之间的比较,更加重视速度而不是高精度。

编辑:中等准确度我的意思是小数点后6-7位。 但如果速度有巨大差异,那么我可以选择4-5个位置。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

  1. 基本数据类型

    如评论6-7中所述,小数位数的精度太小,无法通过算法执行此操作。而是使用常量,这是最快的方式。

    const double e=2.7182818284590452353602874713527;
    

    如果涉及 FPU ,常量通常也会存储在那里......同时使用单个常量占用的空间比计算它的函数少得多......

  2. 有限准确度

    只涉及bignum次,因此有任何优点可以使用算法来计算e。算法取决于目标的准确性。同样,对于较小的精度,使用预定义的常量:

    e=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170189
    

    但通常采用十六进制格式,以便更快,更精确地操作:

    e=2.B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF324E7738926CFBE5F4BF8D8D8C31D763DA06C80ABB1185EB4F7C7B5757F5958490CFD47D7C19BB42158D9554F7B46BCED55C4D79FD5F24D6613C31C3839A2DDF8A9A276BCFBFA1C877C56284DAB79CD4C2B3293D20E9E5EAF02AC60ACC93ECEBh
    

    对于有限/有限精度和最佳速度,PSLQ算法最佳。我的理解是找到实数和整数迭代之间关系的算法。

  3. 任意准确性

    对于任意或"固定"精度你需要具有可变精度的算法。这是我在arbnum课程中使用的内容:

    e=(1+1/x)^x where x -> +infinity
    

    如果您选择x作为2的幂,则认识到x只是数字的单个设置位,而1/x具有可预测的位宽。因此e将通过单一划分和pow获得。这是一个例子:

    arbnum arithmetics_e()          // e computation min(_arbnum_max_a,arbnum_max_b)*5 decimals
        {                           // e=(1+1/x)^x  ... x -> +inf
        int i; arbnum c,x;
        i=_arbnum_bits_a; if (i>_arbnum_bits_b) i=_arbnum_bits_b; i>>=1;
        c.zero(); c.bitset(_arbnum_bits_b-i); x.one(); x/=c; c++;
        for (;!x.bitget(_arbnum_bits_b);x>>=1) c*=c;    //=pow(c,x);
        return c;
        }
    

    其中_arbnum_bits_a,_arbnum_bits_b是二进制小数点前后的位数。所以它通过平方分解为一些位操作,一个bignum除法和单个幂。要注意乘法和除法并不像bignums那么简单,通常涉及Karatsuba或更糟糕......

    还有一些多项式方法,不需要类似于计算bignum的{​​{1}}算术。想法是每次迭代计算二进制位块,而不影响先前计算的位(太多)。它们应该更快,但通常用于依赖于实现和运行的HW的任何优化。