跳轉到內容

Common Lisp/高階主題/數字

來自 Wikibooks,開放的書籍,開放的世界

Common Lisp 比大多數程式語言更支援執行數字運算任務。這是透過支援大整數、有理數和複數,以及許多用於操作它們的函式來實現的。

數字型別

[編輯 | 編輯原始碼]

數字型別的層次結構如下所示

  • number
    • real
      • rational
        • integer
          • fixnum
          • bignum
        • ratio
      • float
        • short-float
        • single-float
        • double-float
        • long-float
    • complex

Fixnums 和 Bignums

[編輯 | 編輯原始碼]

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)提供相應的雙曲函式。
  • expexpt 執行冪運算。exp 接受一個引數並計算 ex,而 expt 接受兩個引數(底數和指數)。
  • sqrt 計算一個數字的平方根。
  • log 計算對數。如果提供一個引數,則計算自然對數。如果提供了兩個引數,則第二個引數用作底數。
  • conjugate 返回一個數字的 共軛複數。對於實數,結果是數字本身。
  • abs 返回一個數字的絕對值(或模數)。
  • phase 返回一個數字的複數輻角(角度分量)。
  • signum 返回一個與它的引數具有相同相位的數字,但模數為單位。

以下函式針對特定型別的數字定義

  • gcdlcm 計算幾個整數的 最大公約數最小公倍數
  • isqrt 返回小於或等於給定自然數的精確平方根的最大整數。
  • cis 計算 e,其中 φ 以弧度給出。

數字比較

[編輯 | 編輯原始碼]

以下函式可用於比較數字。每個函式都接受任意數量的引數。

  • = 如果所有引數都是相同值的數字,則返回 t,否則返回 nil。由於浮點數的精度問題,不建議對它們使用 =
  • /= 如果所有引數都是不同值的數字,則返回 t。請注意,(/= a b c) 不總是與 (not (= a b c)) 相同。
  • <, <=, >, >= 檢查它們的引數是否按適當的單調順序排列。這些函式不能應用於複數,原因顯而易見。
  • maxmin 分別返回它們引數中的最大值和最小值。

數值型別操作

[編輯 | 編輯原始碼]

這些函式用於將數字從一種型別轉換為另一種型別。

  • 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)。可以提供第二個可選引數,它必須是浮點數 - 它將用作原型。結果將與原型具有相同的浮點數型別。
  • rationalrationalize 將實數轉換為有理數。當這個數字是浮點數時,rational 返回一個在數學上等價於浮點數的有理數。rationalize 逼近浮點數。前一個函式通常會產生分母很大的比率,因此它不像您想象的那樣有用。
  • numeratordenominator 返回有理數的對應部分。
  • complex 從實部和虛部建立複數。函式 realpartimagpart 返回一個數字的實部和虛部。
[編輯 | 編輯原始碼]

謂詞如果為真則返回非 nil 結果,如果為假則返回 nil

  • zerop - 數字為零(Lisp 中可能存在多個零 - 整數零、實數零、複數零,也可能存在負零)。
  • plusp, minusp - 實數為正/負。
  • evenp, oddp - 整數為奇數/偶數。
  • integerp - 數字為整數(型別為 integer - 參見上面的型別樹)。
  • floatp - 數字為浮點數。
  • rationalp - 數字為有理數。
  • realp - 數字為實數。
  • complexp - 數字為複數。
華夏公益教科書