統測資電類・資訊科專業科目(二)核心考點

第 11 章:數學函式庫與應用題

本章統整統測程式設計中「數學函式庫」的核心工具:sqrt、pow、sin、fabs、floor、ceil、fmin、fmax,以及用勘根定理判斷區間解的應用題(111~115 年共計 3 題考古真題)。 出題老師最愛把「定義域錯誤(domain error)」與「多層函式呼叫的逐步計算」揉合在一起設計陷阱。 本教學將帶你掌握逐步拆解多層函式呼叫的技巧,並透過3 題真題 + 5 題模擬題的所有選項深度剖析,徹底掃除所有答題盲點!

📐
6 大核心
數學函式庫觀念全解構
🎯
3 題真題
111~115 統測題全收錄
💡
全選項剖析
A/B/C/D 逐項深入拆解
🚀
100% 互動
點擊即答 + 展開詳解

1 sqrt()、pow()、sin() 等常用數學函式

<math.h> 提供了許多常用數學函式:sqrt()(開根號)、pow(x,y)(x 的 y 次方)、sin()(正弦)等。使用前記得先 #include <math.h>。

C Code:pow() 與 sqrt() 計算畢氏定理
#include <stdio.h>
#include <math.h>
int main(void) {
    double a = 3, b = 4;
    double c = sqrt(pow(a, 2) + pow(b, 2)); // 斜邊 = √(a² + b²)
    printf("%.1f\n", c); // 5.0
    return 0;
}
🖥️ 終端機執行輸出結果
5.0
💡 白話比喻:函式庫就是一本現成的公式手冊

與其自己手刻開根號、算三角函數的演算法,不如直接呼叫 <math.h> 這本現成的「公式手冊」——pow(x, y) 算x的y次方、sqrt(x) 算平方根,兩者組合起來就能直接照數學公式寫出畢氏定理,不需要重新發明輪子。

2 定義域(domain)錯誤:對負數開根號

使用數學函式時要留意定義域(domain)問題——例如對負數開根號在數學上無定義(沒有實數解),執行時會產生 domain error,即使程式語法完全正確,也會在執行期出錯。

C Code:sin(x) 在特定區間為負,開根號會出錯
#include <math.h>
float x = 6.28, y;
while (x > 0) {
    y = sqrt(sin(x));   // 若 sin(x) < 0,這裡就會發生 domain error
    x -= 0.1;
}
x(弧度)範圍sin(x) 的正負號
(0, π) 約(0, 3.1416)正
(π, 2π) 約(3.1416, 6.2832)負
⚠️ 統測常考陷阱:x 的初始值剛好落在 sin(x) 為負的區間

正弦函數 sin(x) 一個完整週期是 2π≈6.2832,其中 (π, 2π)(約3.14~6.28)這段範圍的函數值是負數。如果迴圈裡 x 的值(弧度)剛好落在這個區間,sin(x) 算出負值,緊接著的 sqrt() 就會嘗試對負數開根號,觸發 domain error。

3 fabs()/floor()/ceil():絕對值與捨去進位

這三個函式都要 #include <math.h>,分別對應「絕對值」、「無條件捨去」、「無條件進位」,跟四捨五入(需自己用 +0.5 後取整數部分)是不同的觀念。

C Code:fabs/floor/ceil 常用數學函式
#include <stdio.h>
#include <math.h>
int main(void) {
    printf("%.1f\n", fabs(-7.5));  // 7.5,取絕對值
    printf("%.1f\n", floor(3.7));  // 3.0,無條件捨去到整數
    printf("%.1f\n", ceil(3.2));   // 4.0,無條件進位到整數
    return 0;
}
函式作用方向
fabs(x)取絕對值結果必為正數(或0)
floor(x)無條件捨去永遠往「較小」(負無窮)方向捨去
ceil(x)無條件進位永遠往「較大」(正無窮)方向進位
⚠️ 陷阱:floor/ceil 對負數的方向容易搞混

對負數而言,floor(-2.3) 是-3(比-2.3更小、更負的方向),不是直覺以為的-2;ceil(-2.3) 才是-2(比-2.3更大的方向)。floor/ceil 永遠是照「數線上的方向」(左邊變小、右邊變大)判斷,不是「捨去小數部分讓數字更靠近0」。

4 fmin()/fmax():比較並回傳較小/較大值

fmin(x, y) 回傳兩個浮點數中較小的那個;fmax(x, y) 回傳較大的那個。常跟 pow()、sqrt()、exp() 等函式組合出現在同一個運算式裡。

C Code:fmin/fmax 與其他數學函式組合運算
#include <math.h>
int X1=10, X2=10000, Y=3;
printf("%6.2f", fmin(pow(X1, Y), sqrt(X2)));
// pow(X1,Y) = 10³ = 1000
// sqrt(X2)  = sqrt(10000) = 100
// fmin(1000, 100) = 100 → 輸出 "100.00"
🧠 逐步拆解多層函式呼叫的訣竅:由內往外,一步一步算

遇到 fmin(pow(X1,Y), sqrt(X2)) 這種巢狀函式呼叫,不要試圖一眼看穿最終結果,先把每一個「最內層」的函式單獨算出數值(pow(X1,Y)=?、sqrt(X2)=?),再把算出來的數值代入最外層的 fmin() 或 fmax() 比較,一步一步來就不容易出錯。

5 勘根定理(Intermediate Value Theorem):判斷區間內是否存在函數的解

判斷一個連續函數在區間 [m, n] 內是否存在零點(f(x)=0的解),數學上常用勘根定理:只要區間兩端點的函數值 f(m) 與 f(n) 異號(相乘小於等於0),該區間內就必定存在一個解。

C Code:用 f(m)*f(n)<=0 判斷區間內是否存在解
#include <math.h>
double f(double x) { return x - 2; }   // 假設的連續函數

if (f(1) * f(3) <= 0) {
    printf("[1,3] 區間內存在 f(x)=0 的解\n");  // 因 f(1)=-1, f(3)=1,異號 → 成立
}
💡 為什麼是「相乘」而不是「相加」或「相減」?

兩個數異號(一正一負)的數學表示法,就是「兩數相乘會得到負數(或其中一個為0時得到0)」——這正是勘根定理判斷式要用乘法的原因。相加或相減都無法可靠地反映「兩數是否異號」這件事:例如一正一負相加,結果可能是正也可能是負,取決於誰的絕對值比較大,不能保證一定小於等於0。

6 常考陷阱總複習:型態、精度與定義域的交互影響

數學函式庫題目常把「浮點數精度」、「格式化輸出」、「定義域」這幾個觀念揉合在一起考。整理三個檢查重點:

檢查重點常見陷阱
定義域對負數 sqrt()、對超出範圍的 x 用不適用的函式
格式化輸出%.3f 這類精度指定符只規定小數位數,不影響整數部分位數
多層函式呼叫要由內往外逐步計算,不要跳過中間步驟直接猜結果
🧠 記憶口訣

「開根號先看正負,算函式先算裡面」——看到 sqrt() 先確認裡面的運算式會不會是負數;看到多層函式呼叫,先由最內層開始一步步算出中間值,再往外代入。

7 111~115 歷屆統測真題全選項深度剖析(共 3 題)

以下收錄統測專業科目(二)近年全部 3 題數學函式庫與應用題真題。每題均提供高解析度原始考題掃描圖、互動選項按鈕與所有選項逐項深入解析:

113 統測專二 Q42 📌 概念:函式/數值方法(勘根定理IVT應用)
試題來源:技專校院入學測驗中心
針對一次多項式f(x)=ax+b,想知道x落在[m,n]範圍內時是否存在f(x)=0,若found為1表示範圍內存在f(x)=0,if判斷式中 ?? 可以為下列何者?
題幹程式碼
float a=1, b=0, m=-11, n=12;
float f(float x){
    return(a*x+b);
}
int main(){
    float x;
    unsigned char found=0;
    scanf("%f",&a); scanf("%f",&b);
    scanf("%f",&m); scanf("%f",&n);
    if(  ??  <=0 )
        found = 1;
    printf("found=%d\n", found);
}
113 統測專二 Q42 題目截圖
本題標準答案: (A) f(m) * f(n)

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
這是勘根定理的標準判斷方式:若f(m)與f(n)兩端點函數值異號(或其中一端為0),代表[m,n]內必存在f(x)=0的解,數學表示即為兩端點函數值相乘小於等於0,即 f(m)*f(n) <= 0,選 (A)。
選項 B(f(m) + f(n))錯誤解析
兩數相加的正負號無法反映「兩數是否異號」——例如f(m)=-10, f(n)=1,兩數確實異號(區間內有解),但相加-10+1=-9小於0;若f(m)=10, f(n)=1,兩數同號(都是正,區間內未必有解),相加卻是11大於0。但也可能出現兩個都是負數的情況相加同樣小於0,無法用加法可靠地分辨兩數是否異號。
選項 C(f(m) - f(n))錯誤解析
兩數相減的正負號代表的是「哪一個值比較大」,跟兩數是否異號完全是兩回事——例如f(m)=5, f(n)=3(同號,都是正),相減得2大於0;但f(m)=-5,f(n)=-8(同號,都是負)相減同樣大於0,兩種情況結果符號一樣卻無法反映「是否異號」這個要判斷的重點。
選項 D(f(m) % f(n))錯誤解析
% 是取餘數運算子,只能用在整數型態上,f(m)、f(n)是浮點數(float)運算的結果,對浮點數使用 % 在C語言中無法通過編譯(型態不符),而且取餘數的結果跟「兩數是否異號」也沒有直接的數學關聯。
114 統測專二 Q47 📌 概念:數學函式庫/浮點數運算除錯(定義域錯誤)
試題來源:技專校院入學測驗中心
程式執行後畫面出現錯誤訊息,其造成原因為何?
題幹程式碼
#include <math.h>
float x=6.28, y;
int i;
while(x>0){
    y=sqrt(sin(x));
    printf("square root of sin(%f) = %f\n", x, y);
    x-=0.1;
}
114 統測專二 Q47 題目截圖
本題標準答案: (A) 迴圈中計算sin(x)結果值為負數,再開根號所導致

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
x(弧度)從6.28開始每次遞減0.1,範圍大致涵蓋(0, 6.28],橫跨了幾乎一整個週期(0, 2π≈6.2832)。sin(x) 在(π, 2π)區間(約3.1416~6.2832)為負值,x的初始值6.28正好落在此區間,sqrt() 對負數開根號屬於數學定義域錯誤(domain error),選 (A)。
選項 B(sin(x)結果為0)錯誤解析
sin(x)的值為0(例如x剛好等於π或2π的整數倍附近)並不會造成sqrt()發生任何錯誤——0的平方根就是0,這是完全合法、有定義的運算,不會產生domain error。
選項 C(x是單精度浮點數)錯誤解析
float(單精度浮點數)本身可以正常傳入sin()函式並得到夠精確的三角函數值,資料精度不是造成這個錯誤訊息的原因;即使把x改成double,只要x的值仍然落在讓sin(x)為負的區間,sqrt()一樣會發生同樣的定義域錯誤。
選項 D(x有負數的情況)錯誤解析
sin()函式對負數的x本身是完全有定義的(正弦函數在整個實數範圍內都有值),問題並不是出在x本身是不是負數,而是出在sin(x)這個「函式回傳的結果值」在某些x的情況下會是負數,才會導致後續的sqrt()發生定義域錯誤。
115 統測專二 Q48 📌 概念:函式庫呼叫(數學函式pow/sqrt/fmin/fmax)
試題來源:技專校院入學測驗中心
在 int X1=10, X2=10000, Y=3; 的情況下,下列何者執行結果為100.00?
題幹程式碼(函式說明)
// double fmin(double x, double y)  比較並回傳較小值
// double fmax(double x, double y)  比較並回傳較大值
// double pow(double x, double y)   計算x的y次方
// double exp(double x)             計算e的x次方
// double sqrt(double x)            計算x的平方根

// 已知 int X1=10, X2=10000, Y=3;
printf("%6.2f", fmin(pow(X1, Y), sqrt(X2)));
115 統測專二 Q48 題目截圖
本題標準答案: (B) printf("%6.2f", fmin(pow(X1, Y), sqrt(X2)));

🔍 四個選項逐項深度剖析

選項 A 錯誤解析
pow(X1,Y)=10³=1000;exp(Y)=e³≈20.09。fmin(1000, 20.09) 會取兩者中較小的,也就是20.09,格式化輸出會是"20.09",並不是100.00。
正確答案完整推導(★ 本題標準答案)
pow(X1,Y)=10³=1000;sqrt(X2)=sqrt(10000)=100。fmin(1000,100) 取兩者中較小的,也就是100,格式化輸出為"100.00",符合題目要求,選 (B)。
選項 C 錯誤解析
pow(X1,Y)=1000;exp(Y)≈20.09。fmax(1000,20.09) 會取兩者中較大的,也就是1000,格式化輸出會是"1000.00",並不是100.00。
選項 D 錯誤解析
pow(X1,Y)=1000;sqrt(X2)=100。fmax(1000,100) 會取兩者中較大的,也就是1000,格式化輸出會是"1000.00",並不是100.00——這個選項的兩個函式參數(pow,sqrt)其實跟正確答案(B)一模一樣,但用fmax(取最大值)取代了應該用的fmin(取最小值),一字之差導致結果完全不同。

8 高職段考與模擬精選實戰題(5 題全選項解析)

透過以下 5 題精選模擬試題,全面檢驗你對常用數學函式、定義域錯誤、fmin/fmax與勘根定理的掌握度:

模擬實戰第 1 題 📌 概念:pow()/sqrt() 計算畢氏定理
已知下列 C 語言程式碼片段,執行後印出的內容為何?
C Code
double a = 6, b = 8;
double c = sqrt(pow(a,2) + pow(b,2));
printf("%.1f", c);
本題標準答案: (A) 10.0

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
pow(a,2)=6²=36;pow(b,2)=8²=64;相加得100;sqrt(100)=10。格式化輸出"10.0",選 (A)。
選項 B(14.0)錯誤解析
此答案很可能是把 a+b=6+8=14 直接當成答案,完全跳過了pow()平方跟sqrt()開根號這兩個關鍵運算步驟。
選項 C(100.0)錯誤解析
此答案算對了 pow(a,2)+pow(b,2)=36+64=100 這個中間值,但忘記了外層還有一個 sqrt() 要對這個中間值開根號,100本身還不是最終答案,還需要再開一次根號變成10。
選項 D(7.0)錯誤解析
此答案的來源不易對應到程式碼實際的運算過程,可能是心算過程中某個平方或加總步驟出錯,導致最終開根號前的數值算錯,得到不正確的結果。
模擬實戰第 2 題 📌 概念:sqrt() 定義域錯誤
已知下列 C 語言程式碼片段,執行時會發生什麼情況?
C Code
#include <math.h>
double x = -9;
double y = sqrt(x);
printf("%.1f", y);
本題標準答案: (A) 產生定義域錯誤(domain error),因為對負數開根號在數學上無意義

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
x=-9是負數,對負數執行 sqrt() 開根號在數學上沒有實數解,這是定義域錯誤(domain error),屬於執行期才會發生的錯誤,選 (A)。
選項 B(正常輸出-3.0)錯誤解析
此答案誤以為sqrt()會回傳一個負的平方根,但數學上「平方根」的定義本來就不包含負數的情況(-9沒有實數平方根),sqrt()不會回傳-3.0這種負數結果。
選項 C(正常輸出3.0)錯誤解析
此答案誤以為sqrt()會自動先把輸入值取絕對值(把-9當成9來開根號),但sqrt()並不會這麼做,它會直接對輸入值-9本身嘗試開根號,觸發定義域錯誤,而不是先取絕對值再正常運算。
選項 D(編譯錯誤)錯誤解析
這段程式碼的語法完全正確,sqrt()接受一個double型態的引數也完全符合函式原型,可以正常通過編譯;問題是發生在執行期的定義域錯誤,不是編譯期的語法錯誤。
模擬實戰第 3 題 📌 概念:floor/ceil/fabs 對負數的方向
已知下列 C 語言程式碼片段,執行後印出的內容為何?
C Code
#include <math.h>
printf("%.0f %.0f %.0f", floor(-2.3), ceil(-2.3), fabs(-2.3));
本題標準答案: (A) -3 -2 2

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
floor(-2.3) 無條件捨去到「較小」的整數(往負無窮方向捨去),結果是-3.0;ceil(-2.3) 無條件進位到「較大」的整數(往正無窮方向進位),結果是-2.0;fabs(-2.3) 取絕對值,結果是2.3,用 %.0f 四捨五入到整數位是2。輸出"-3 -2 2",選 (A)。
選項 B(-2 -3 2)錯誤解析
把floor跟ceil的方向弄反了。floor是「往下(較小的方向)」捨去,ceil是「往上(較大的方向)」進位——對負數而言,「往下」代表數值更小(更負),所以floor(-2.3)應該是-3(比-2.3更小),不是-2;ceil(-2.3)才是-2。
選項 C(-3 -2 -2)錯誤解析
前兩個算對了,但 fabs(-2.3) 算錯了——fabs是取絕對值,結果必定是正數(或0),2.3的絕對值是2.3,不會維持負數-2.3,也不會是-2。
選項 D(-2 -2 2)錯誤解析
floor(-2.3) 算錯了,誤以為floor對負數的捨去方向跟對正數一樣「捨去小數部分、只留整數部分朝0靠近」(也就是變成-2),但floor對負數的正確行為是「朝負無窮方向捨去」,結果應該是比-2.3更小的-3,不是-2。
模擬實戰第 4 題 📌 概念:fmin/fmax 與多層函式呼叫
已知下列 C 語言程式碼片段,執行後印出的內容為何?
C Code
#include <math.h>
double p = pow(2, 5);
double s = sqrt(49);
printf("%.1f %.1f", fmin(p, s), fmax(p, s));
本題標準答案: (A) 7.0 32.0

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
p=pow(2,5)=2⁵=32;s=sqrt(49)=7。fmin(32,7) 取較小的,得7;fmax(32,7) 取較大的,得32。依printf引數順序輸出"7.0 32.0",選 (A)。
選項 B(32.0 7.0)錯誤解析
把fmin跟fmax的結果對調了,誤以為fmin回傳的是較大值、fmax回傳的是較小值,但實際上fmin是取「較小」值、fmax是取「較大」值,這個選項的邏輯剛好相反。
選項 C(32.0 32.0)錯誤解析
兩個值都算成了p跟s中較大的那個(32),可能誤以為fmin跟fmax在這種情境下效果相同,但兩者的定義明確不同,一個取較小、一個取較大,結果不會一樣。
選項 D(7.0 7.0)錯誤解析
兩個值都算成了p跟s中較小的那個(7),同樣誤以為fmin跟fmax效果相同,忽略了兩者分別對應「較小值」與「較大值」這個關鍵差異。
模擬實戰第 5 題 📌 概念:勘根定理(IVT)應用判斷
已知下列 C 語言程式碼片段,執行後印出的內容為何?
C Code
#include <math.h>
double f(double x) { return x*x - 4; }  // f(x)=x²-4
int main(void) {
    double m = 0, n = 3;
    if (f(m) * f(n) <= 0)
        printf("區間內存在解");
    else
        printf("區間內可能不存在解");
    return 0;
}
本題標準答案: (A) 區間內存在解

🔍 四個選項逐項深度剖析

正確答案完整推導(★ 本題標準答案)
f(0)=0²-4=-4;f(3)=3²-4=5。兩端點函數值一負一正,異號,f(0)*f(3)=-4×5=-20,小於等於0,判斷式成立,依勘根定理,[0,3]這個區間內必定存在至少一個f(x)=0的解(實際上x=2就是一個解,2確實落在[0,3]區間內),印出"區間內存在解",選 (A)。
選項 B 錯誤解析
此答案誤判了f(0)與f(3)是否異號,或誤算了 f(0)*f(3) 的正負號。f(0)=-4為負,f(3)=5為正,兩者相乘必為負數(小於等於0),判斷式 <=0 成立,應該執行if分支印出「存在解」,不會是else分支。
選項 C 錯誤解析
這段程式碼語法完全正確,函式定義、變數宣告、if-else判斷式都符合標準C語法,不會有編譯錯誤。
選項 D 錯誤解析
這段程式碼裡沒有任何迴圈結構(只有一個簡單的if-else判斷),不會發生無窮迴圈的情況。

9 考前衝刺 10 秒速記口訣 & 核心知識檢核清單

✅
常用數學函式
sqrt()開根號、pow(x,y)算x的y次方、sin()正弦,都需要#include <math.h>。
✅
定義域錯誤
sqrt()對負數會產生domain error;先確認裡面的運算式會不會變成負數。
✅
floor/ceil 對負數的方向
floor永遠往負無窮(更小)方向捨去;ceil永遠往正無窮(更大)方向進位。
✅
fmin/fmax 不要混淆
fmin取較小值、fmax取較大值,一字之差結果可能完全不同。
✅
勘根定理口訣
兩端點函數值f(m)、f(n)異號 ⇔ f(m)*f(n)<=0 ⇔ 區間內必有解,只有乘法能可靠判斷異號。
✅
多層函式呼叫由內往外算
先算出最內層函式的數值,再一步步代入外層函式,不要跳步驟直接猜答案。