我可以在编译时计算pow(10,x)
是否有可能在编译时计算pow(10,x)?
我有一个没有浮点支持和慢整数除法的处理器。 我试图在编译时尽可能多地执行计算。 如果我将x
和C/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
,但如果需要float
或long double
,则可以附加浮点后缀( f
, F
, l
或L
)。
我不会推荐将这个语义包装成一个宏:
在溢出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