【C++ 筆記】數學函式庫(cmath library) - part 7.5 === 目錄(Table of Contents): [TOC] --- 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 上節介紹到函數的概念,我們說函數就像是一台有功能的機器,在數學函式庫中,裡面的函數恰好能展現此一概念,故此節介紹 cmath。 cmath --- 語法: ```cpp= #include <cmath> ``` 有關其函數,列下表: | 序號 | 函數 | | -------- | -------- | | 1 | double cos(double); | | 2 | double sin(double); | | 3 | double tan(double); | | 4 | double log(double); | | 5 | double pow(double, double); | | 6 | double hypot(double, double); -> 註:畢氏定理計算斜邊公式(根號a平方+b平方) | | 7 | double sqrt(double); -> 計算平方根 | | 8 | int abs(int); -> 計算絕對值 | | 9 | double fabs(double); -> 回傳任意一個浮點數的絕對值 | | 10 | double floor(double); -> 小數點無條件退位至整數位 | 註:ceil(x) 函數與 floor(x) 相對,為無條件進位。(正確定義為:Returns the value of x rounded up to its nearest integer,為了方便理解所以故作此解釋) 有關細則可至:[C++ cmath Library Reference (cmath functions)](https://www.w3schools.com/cpp/cpp_ref_math.asp) w3schools 查看。 :::success Returns the value of x rounded up to its nearest integer 回傳 x 的值進位到最接近的整數 ::: 表格來源:https://www.runoob.com/cplusplus/cpp-numbers.html 以下是一個練習範例: ```cpp= #include <iostream> #include <cmath> // 引入數學函數標頭檔 int main() { // 定義常數 const double x = 2.5; const double y = 3.0; // 輸出常數值 std::cout << "常數 x = " << x << std::endl; std::cout << "常數 y = " << y << std::endl; // 三角函數 std::cout << "cos(x) = " << cos(x) << std::endl; std::cout << "sin(x) = " << sin(x) << std::endl; std::cout << "tan(x) = " << tan(x) << std::endl; // 指數與對數 std::cout << "log(x) = " << log(x) << " (自然對數)" << std::endl; std::cout << "pow(x, y) = " << pow(x, y) << " (x 的 y 次方)" << std::endl; // 幾何函數 std::cout << "hypot(x, y) = " << hypot(x, y) << " (x 和 y 的歐幾里德距離)" << std::endl; // 平方根 std::cout << "sqrt(x) = " << sqrt(x) << std::endl; // 絕對值 std::cout << "abs(-x) = " << abs(-x) << " (整數絕對值)" << std::endl; std::cout << "fabs(-x) = " << fabs(-x) << " (浮點數絕對值)" << std::endl; // 無條件進退位 std::cout << "floor(x) = " << floor(x) << " (無條件退位)" << std::endl; std::cout << "ceil(x) = " << ceil(x) << " (無條件進位)" << std::endl; return 0; } ``` 輸出結果: ``` 常數 x = 2.5 常數 y = 3.0 cos(x) = -0.801144 sin(x) = 0.598472 tan(x) = -0.747022 log(x) = 0.916291 (自然對數) pow(x, y) = 15.625 (x 的 y 次方) hypot(x, y) = 3.90512 (x 和 y 的歐幾里德距離) sqrt(x) = 1.58114 abs(-x) = 2 (整數絕對值) fabs(-x) = 2.5 (浮點數絕對值) floor(x) = 2 (無條件退位) ceil(x) = 3 (無條件進位) ``` 註:歐幾里德距離就是高中學的距離公式,通常也使用勾股定理(畢氏定理)作為歐幾里德距離,此例中即使用勾股定理。 隨機數(random) --- 要生成隨機數,需用到兩種函數:rand()、srand()。 rand() 用於生成偽隨機數,在之前需要用到 srand(),為什麼呢?各位可以先想想再點開以下答案。 :::spoiler 點我看答案 srand() 用於設定隨機種子(randomseed),若不使用 srand() 當作 seed,則 rand() 預設的 seed 為 0,意即此為固定的隨機序列,每次打開程式時都是固定的隨機數。 設定隨機種子會讓隨機序列更加隨機。 ::: 以下是一個範例,用 time() 函數得到系統時間的秒數,當作隨機種子使用: ```cpp= #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main () { int i,j; // 設定隨機種子 srand( (unsigned)time( NULL ) ); /* 生成 10 個隨機數 */ for( i = 0; i < 10; i++ ) { // 生成實際的隨機數 j= rand(); cout <<"random: " << j << endl; } return 0; } ``` 來源:https://www.runoob.com/cplusplus/cpp-numbers.html 輸出結果(不定): ``` random: 1711621864 random: 1916654369 random: 1613611712 random: 1966213583 random: 193755691 random: 1786444714 random: 149637669 random: 1314185198 random: 2077363357 random: 881636108 ``` 參考資料 --- [C++ cmath Library Reference (cmath functions)](https://www.w3schools.com/cpp/cpp_ref_math.asp) [C++ 数字 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-numbers.html)