代码之家  ›  专栏  ›  技术社区  ›  AShelly

我可以在编译时用c计算pow(10,x)吗?

  •  12
  • AShelly  · 技术社区  · 16 年前

    x C/pow(10,x) 1/pow(10,x)

    10 回复  |  直到 16 年前
        1
  •  21
  •   Bill K    16 年前

        2
  •  20
  •   Sadeq Dousti    7 年前

    GCC将在足够高的优化级别上完成此操作(-O1为我完成)。例如:

    #include <math.h>
    
    int test() {
            double x = pow(10, 4);
            return (int)x;
    }
    

    在-O1-m32编译为:

            .file   "test.c"
            .text
    .globl test
            .type   test, @function
    test:
            pushl   %ebp
            movl    %esp, %ebp
            movl    $10000, %eax
            popl    %ebp
            ret
            .size   test, .-test
            .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
            .section        .note.GNU-stack,"",@progbits
    

    这也可以在没有强制转换的情况下工作——当然,你会在那里得到一个浮点加载指令,就像Linux一样 ABI 在FPU寄存器中传递浮点返回值。

        3
  •  11
  •   e.tadeu    16 年前

    你可以用Boost来实现。预处理器:

    http://www.boost.org/doc/libs/1_39_0/libs/preprocessor/doc/index.html

    代码:

    #include <boost/preprocessor/repeat.hpp>
    
    #define _TIMES_10(z, n, data) * 10
    #define POW_10(n) (1 BOOST_PP_REPEAT(n, _TIMES_10, _))
    
    int test[4] = {POW_10(0), POW_10(1), POW_10(2), POW_10(3)};
    
        4
  •  9
  •   Jon Gjengset    11 年前

    C pow(10, x) 对于任何真实 C x 请注意,正如@quinmars所指出的,C允许您使用科学语法来表示数字常量:

    #define myexp 1.602E-19   // == 1.602 * pow(10, -19)
    

    用于常量。考虑到这一点,再加上一些巧妙之处,我们可以构建一个预处理器宏 C

    #define EXP2(a, b) a ## b
    #define EXP(a, b) EXP2(a ## e,b)
    #define CONSTPOW(C,x) EXP(C, x)
    

    const int myint = CONSTPOW(3, 4); // == 30000
    const double myfloat = CONSTPOW(M_PI, -2); // == 0.03141592653
    
        5
  •  8
  •   quinmars    14 年前

    e = 1.602E-19   // == 1.602 * pow(10, -19)
    

    E (the 可能是资本或小 1.602e-19 )是分数部分,其中作为(有符号的)数字序列 E 是指数部分。默认情况下,该数字的类型为 double f , F , l L float 或a long double .

    1. 科学符号更易读。
        6
  •  4
  •   Benny    13 年前

    $ cat foo.c
    define(M4_POW_AUX, `ifelse($2, 1, $1, `eval($1 * M4_POW_AUX($1, decr($2)))')')dnl
    define(M4_POW, `ifelse($2, 0, 1, `M4_POW_AUX($1, $2)')')dnl
    
    #include <stdio.h>
    
    int                     main(void)
    {
      printf("2^0 = %d\n", M4_POW(2, 0));
      printf("2^1 = %d\n", M4_POW(2, 1));
      printf("2^4 = %d\n", M4_POW(2, 4));
    
      return 0;
    }
    

    编译此代码示例的命令行使用GCC和M4从标准输入读取的能力。

    $ cat foo.c | m4 - | gcc -x c -o m4_pow -
    $ ./m4_pow
    2^0 = 1
    2^1 = 2
    2^4 = 16
    

        7
  •  4
  •   phuclv    6 年前

    如果你只需要使用以下值 编译时 scientific notation 如1e2 pow(10, 2)

    运行时 那么只需使用查找表,因为 only 23 different powers of 10 那些 完全可代表 双精度

    double POW10[] = {1., 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10,
    1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22};
    

    您可以在运行时从上面的查找表中获得更大的10次幂,以快速获得结果,而不需要一次又一次地乘以10,但结果只是一个接近10次幂的值,就像您使用10eX和X>22

    double pow10(int x)
    {
       if (x > 22)
          return POW10[22] * pow10(x - 22);
       else if (x >= 0)
          return POW10[x];
        else
            return 1/pow10(-x);
    }
    

        8
  •  3
  •   Chris Arguin    16 年前

    当然,它的能力是有限的。 Here's a link to the description in the changelog ,其中包括此支持的功能列表。pow就是其中之一。

        9
  •  0
  •   David Thornley    16 年前

        10
  •  0
  •   ojblass    16 年前