我可以在编译时计算pow(10,x)

是否有可能在编译时计算pow(10,x)?

我有一个没有浮点支持和慢整数除法的处理器。 我试图在编译时尽可能多地执行计算。 如果我将xC/pow(10,x)作为参数传递(x和C总是常量整数,但对于每次调用它们是不同的常量C/pow(10,x) ,我可以大大加快某个特定函数的速度。 我想知道是否可以通过引入一个自动执行1/pow(10,x)的宏而不是迫使程序员计算它来使这些函数调用更容易出错。

有没有预处理器技巧? 我可以强制编译器优化库调用吗?


您可以使用科学记数法作为C语言组成部分的浮点值。 它看起来像这样:

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

E之前的数字( E可能是大写或小1.602e-19 )是E之后的(有符号)数字序列是指数部分的小数部分。 默认情况下,该数字的类型是double ,但如果需要floatlong double ,则可以附加浮点后缀( fFlL )。

我不会推荐将这个语义包装成一个宏:

  • 它不适用于变量,浮点值等。
  • 科学记数法更具可读性。

  • 在溢出int(甚至很长)之前,可能的值很少。 为了清晰起见,把它做成一张桌子!

    编辑:如果你正在使用浮动(看起来像你),那么不会在编译时调用pow()函数,而实际上不会编写在make过程中运行的代码并将值输出到文件中如头文件),然后编译。


    海湾合作委员会将在足够高的优化水平(-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寄存器。

    链接地址: http://www.djcxy.com/p/85723.html

    上一篇: Can I compute pow(10,x) at compile

    下一篇: Optimizations for pow() with const non