① 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。