Common Lisp/高階主題/數字
外觀
< Common Lisp | 高階主題
Common Lisp 比大多數程式語言更支援執行數字運算任務。這是透過支援大整數、有理數和複數,以及許多用於操作它們的函式來實現的。
數字型別的層次結構如下所示
- number
- real
- rational
- integer
- fixnum
- bignum
- ratio
- integer
- float
- short-float
- single-float
- double-float
- long-float
- rational
- complex
- real
Fixnums 是不太大的整數,可以非常有效地操作。哪些數字被認為是 fixnums 取決於實現,但所有 [-215,215-1] 中的整數都保證是 fixnums。
Bignums 是不是 fixnums 的整數。它們的尺寸受 Lisp 為其分配的記憶體量限制,因此它們可能非常大。對它們的操作比對 fixnums 慢得多。當然,這並不能使它們不那麼有用。
比率表示兩個整數的比率。它們的形式為 分子/分母。執行除法的函式 / 當其引數是整數或比率時總是產生比率。例如 (/ 1 2) 將得到 1/2,而不是 0.5。其他算術運算也能很好地處理比率。
Float 是 浮點數 的簡稱,一種資料型別,用於在大多數程式語言中表示非整數。Common Lisp 中有四種浮點數,它們提供了越來越高的精度(與實現相關)。預設情況下,實現假定使用短浮點數,它們具有有限的精度。要輸入更精確的浮點數,必須使用其他文字表示法,例如,對於雙精度浮點數,使用 "1.0d0"。
Complex 是一種資料型別,用於表示 複數。複數的表示法為 #C(實部 虛部)。實部和虛部都是有理數或浮點數。可以對複數執行的運算包括所有算術運算,以及許多可以擴充套件到複數的函式(如冪運算和對數運算)。
以下函式針對所有型別的數字定義
- 算術運算 +,-,*,/ 很明顯(注意,它們可以有多個引數)。
- sin, cos, tan, acos, asin, atan 提供三角函式。
- 相同,在末尾新增 h(如 asinh)提供相應的雙曲函式。
- exp 和 expt 執行冪運算。exp 接受一個引數並計算 ex,而 expt 接受兩個引數(底數和指數)。
- sqrt 計算一個數字的平方根。
- log 計算對數。如果提供一個引數,則計算自然對數。如果提供了兩個引數,則第二個引數用作底數。
- conjugate 返回一個數字的 共軛複數。對於實數,結果是數字本身。
- abs 返回一個數字的絕對值(或模數)。
- phase 返回一個數字的複數輻角(角度分量)。
- signum 返回一個與它的引數具有相同相位的數字,但模數為單位。
以下函式針對特定型別的數字定義
以下函式可用於比較數字。每個函式都接受任意數量的引數。
- = 如果所有引數都是相同值的數字,則返回 t,否則返回 nil。由於浮點數的精度問題,不建議對它們使用 =。
- /= 如果所有引數都是不同值的數字,則返回 t。請注意,
(/= a b c)不總是與(not (= a b c))相同。
- <, <=, >, >= 檢查它們的引數是否按適當的單調順序排列。這些函式不能應用於複數,原因顯而易見。
- max 和 min 分別返回它們引數中的最大值和最小值。
這些函式用於將數字從一種型別轉換為另一種型別。
- floor, ceiling, truncate, round 接受兩個引數:數字和除數,並返回商(一個整數)和餘數=數字-商*除數。選擇商的方法取決於函式。floor 選擇不超過比率=數字/除數的最大整數,ceiling 選擇小於比率的最大整數,truncate 選擇與比率符號相同的整數,且絕對值小於比率的絕對值的最大整數,round 選擇最接近比率的整數(如果有兩個這樣的數字,則選擇偶數整數)。注意:這些函式返回兩個值(參見 多個值)。
- ffloor, fceiling, ftruncate, fround 與上面的相同,但商被轉換為與數字相同的浮點數型別。
- (mod a b) 返回 (floor a b) 的第二個值。
- (rem a b) 返回 (truncate a b) 的第二個值。
- float 將第一個引數(一個實數)轉換為浮點數。這可能有助於避免使用有理數進行緩慢的操作(參見示例 1)。可以提供第二個可選引數,它必須是浮點數 - 它將用作原型。結果將與原型具有相同的浮點數型別。
- rational 和 rationalize 將實數轉換為有理數。當這個數字是浮點數時,rational 返回一個在數學上等價於浮點數的有理數。rationalize 逼近浮點數。前一個函式通常會產生分母很大的比率,因此它不像您想象的那樣有用。
- numerator 和 denominator 返回有理數的對應部分。
- complex 從實部和虛部建立複數。函式 realpart 和 imagpart 返回一個數字的實部和虛部。
謂詞如果為真則返回非 nil 結果,如果為假則返回 nil。
- zerop - 數字為零(Lisp 中可能存在多個零 - 整數零、實數零、複數零,也可能存在負零)。
- plusp, minusp - 實數為正/負。
- evenp, oddp - 整數為奇數/偶數。
- integerp - 數字為整數(型別為 integer - 參見上面的型別樹)。
- floatp - 數字為浮點數。
- rationalp - 數字為有理數。
- realp - 數字為實數。
- complexp - 數字為複數。