① linux C语言pow函数问题
像 pow(10,2) 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 pow 所在的数学库 libm;而像 pow(x,2); 这种调用,一般无法做这种替换,因此需要链接 libm。或者编译时加上-O2参数。
② linux下 gcc 编译器 不识别 C语言 pow()函数
要包含头文件:#include
<math.h>
pow()
函数用来求
x
的
y
次幂(次方),其原型为:
double
pow(double
x,
double
y);
pow()用来计算以x
为底的
y
次方值,然后将结果返回。设返回值为
ret,则ret
=
xy。
可能导致错误的情况:
如果底数
x
为负数并且指数
y
不是整数,将会导致
domain
error错误。
如果底数
x
和指数
y
都是
0,可能会导致
domain
error错误,也可能没有;这跟库的实现有关。
如果底数
x
是
0,指数
y
是负数,可能会导致domain
error
或pole
error
错误,也可能没有;这跟库的实现有关。
如果返回值
ret
太大或者太小,将会导致range
error
错误。
③ linux下 gcc 编译器 不识别 C语言 pow()函数
要包含头文件:#include <math.h>
pow() 函数用来求 x 的 y 次幂(次方),其原型为:
double pow(double x, double y);
pow()用来计算以x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则ret = xy。
可能导致错误的情况:
如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error错误。
如果底数 x 和指数 y 都是 0,可能会导致 domain error错误,也可能没有;这跟库的实现有关。
如果底数 x 是 0,指数 y 是负数,可能会导致domain error 或pole error 错误,也可能没有;这跟库的实现有关。
如果返回值 ret 太大或者太小,将会导致range error 错误。
④ 关于pow()函数的问题 c/c++
首先说,我用GCC编译时出现了与LZ相同的差1情况,但用其他编译器无此现象,pow的实际行为来自于各个编译器的不同实现,各有差别是可以理解的,有误差更是无可厚非,然哪怕计算值比理论值少那么0.00000001,转换成整型时结果都会减1。但是传递参数给pow函数时,前后两次的参数事实上是一样的,同样的输入pow不可能会产生不同输出。我看了下GCC产生的汇编代码,发现实际上第二次调用pow实际上并没有真的调用,因为参数都是常量,GCC直接省略了pow调用过程而直接把结果值15625传给了printf函数。相同的调用做了不同处理,因而出现了两种结果。
⑤ 用gcc编译器C语言程序的技巧
方法/步骤
1、编写c代码,并输入以下代码,生成文件hello.c
[root@wahoo
test]#
vim
hello.c
#include
<stdio.h>
#define
DISPLAY
"hello
c!"
int
main(void)
{
printf("%s\n",
DISPLAY
);
return
0;
}
ZZ(说明:ZZ当前文件进行快速保存操作)
2、预编译(Preprocessing)
会对各种预处理指令(#include
#define
#ifdef
等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码
[root@wahoo
test]#gcc
-E
hello.c
-o
hello.i
E
参数
通知gcc对目标文件进行预编译,这里是对文件hello.c文件
o
参数
是对命令输出结果进行导入操作,这里是把
gcc
-E
hello.c
操作结果输出到文件hello.i(命名要自定义)中进行保存
这个命令执行完后我们目录下多了一个文件hello.i,你可以查阅一下文件的内容。
3、编译(Compilation)
对代码进行语法、语义分析和错误判断,生成汇编代码文件
[root@wahoo
test]#gcc
-S
hello.i
-o
hello.s
S
参数
通知gcc对目标文件进行编译,这里是对文件hello.i文件
通过这一步我们知道
C语言跟汇编的
关系,至于他们之前是如何进行转换的,大家可以进行更深入的学习与探讨。
此时目录下多了一个hello.s文件,内容如图
4、汇编(Assembly)
把汇编代码转换与计算机可认识的二进制文件,要知道计算机只认识0和1呢
[root@wahoo
test]#gcc
-c
hello.s
-o
hello.o
c
参数
通知gcc对目标文件执行指令转换操作
此步骤我们得到文件hello.o
大家也同样打开文件查看一下,这个文件里面几乎没几个字符大家能看懂,这就对了,但大家可以通过这种方法将其转化为我们可读的形式:
[root@wahoo
test]#readelf
-a
hello.o
5、链接(Linking/Build)
通俗的讲就是把多个*.o文件合并成一个可执行文件,二进制指令文件
[root@wahoo
test]#gcc
hello.o
-o
hello
这里我们就得到了一个可以直接在系统下执行的文件
hello
我们也可以对这个文件进行readelf操作,也可以进行二进制指令转汇编的操作
[root@wahoo
test]#objmp
-d
hello
6、程序运行
[root@wahoo
test]#./hello
hello
c!
7、总结:gcc
编译c程序的主要过程包括
预编译->编译->汇编->连接
四个过程,每个过程都分别进行不同的处理,了解了这其中的一些原理,对c编程的理解大有益处
⑥ C/C++ 里pow函数 原型 是怎么写的!
首先说,我用gcc编译时出现了与lz相同的差1情况,但用其他编译器无此现象,pow的实际行为来自于各个编译器的不同实现,各有差别是可以理解的,有误差更是无可厚非,然哪怕计算值比理论值少那么0.00000001,转换成整型时结果都会减1。但是传递参数给pow函数时,前后两次的参数事实上是一样的,同样的输入pow不可能会产生不同输出。我看了下gcc产生的汇编代码,发现实际上第二次调用pow实际上并没有真的调用,因为参数都是常量,gcc直接省略了pow调用过程而直接把结果值15625传给了printf函数。相同的调用做了不同处理,因而出现了两种结果。
⑦ 在GCC 编译时,因连接GFORTRAN 的子程序 出错:“_gfortran_pow_i4_i4’未定义的引用”是什么原因
fortran 的编译标准有很多,最着名的当然是fortran77。GCC里的应该就是fortran77了。gfortran是另一个标准而已。自从fortran90以后,鼓励大家用自由方式写fortran代码(就是不强制空六格之类)。所以fortran77就慢慢不是那么主流了。以上只是个人了解,有错误望指正。
⑧ linux用gcc编译
运行结果我不给了,自己看:
直接编译:
gcc main.c compute.c input.c -o power
运行程序
./power
makefile 最简单,直观的的编写方法:
power:main.o compute.o input.o
cc main.o compute.o input.o -o power
main.o:main.c main.h compute.h input.h
cc -c main.c
compute.o:compute.c compute.h
cc -c compute.c
input.o:input.c input.h
cc -c input.c
.PHONY : clean
clean :
rm -f *.o power
保存后成makefile或Makefile推荐使用后者:
make
想重新编译前运行:
make clean
make
运行程序:
./power
特别说明:cc,rm命令行前有一个tab符,别搞错了。cc 在linux上是指向gcc的软符号链接,为了兼容其他系统,我们写的cc。
makefile有更简写但不简单的写法,不给出来。你提问这个说明你不会编写makefile,给出的是最基本用法。有兴趣自己看,一天能学完。
⑨ Linux下编译程序时,出现undefined reference to"pow"。是不是POW函数只能使用一次
-lm是正解。
像 pow(2,3); 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 pow 所在的数学库 libm;而像 pow(a,2); 这种调用,一般无法做这种替换,因此需要链接 libm。