當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R Arithmetic 算術運算符


R語言 Arithmetic 位於 base 包(package)。

說明

這些一元和二元運算符對數字或複數向量(或可以強製轉換為它們的對象)執行算術運算。

用法

+ x
- x
x + y
x - y
x * y
x / y
x ^ y
x %% y
x %/% y

參數

x , y

數字或複數向量或可以強製轉換為此類的對象,或已為其編寫方法的其他對象。

細節

一元和二元算術運算符是通用函數:可以單獨為它們編寫方法,也可以通過 Ops 組通用函數編寫方法。 (有關如何計算調度的信息,請參閱Ops。)

如果應用於數組,如果這是合理的,結果將是一個數組(例如,如果已調用回收規則,則結果將不是一個數組)。

邏輯向量將被強製為整數或數值向量,FALSE 的值為 0,TRUE 的值為 1。

1 ^ yy ^ 0 始終是 1 。當任一(數字)參數為 infinite ( Inf-Inf 之一)時,x ^ y 也應該給出正確的限製結果。

諸如數組或時間序列之類的對象可以通過這種方式進行操作,隻要它們是一致的。

對於雙參數,如果 x 遠大於 y ,則 %% 可能會遭受災難性的準確性損失,如果檢測到這種情況,則會發出警告。

%%x %/% y 可用於非整數 y ,例如1 %/% 0.2 ,但結果可能會出現表示錯誤,因此可能與平台相關。由於 0.2 的 IEC 60559 表示形式是比 0.2 稍大的二進製分數,因此 1 %/% 0.2 的答案應該是 4,但大多數平台給出 5

用戶有時會對返回的值感到驚訝,例如為什麽(-8)^(1/3)NaN。為了base double輸入,R在所有平台上使用 IEC 60559 算法,以及 C 係統函數‘⁠戰俘⁠' 為了^操作符。相關標準定義了許多極端情況下的結果。特別是,上例中的結果是由 C99 標準強製執行的。在許多類 Unix 係統上,該命令man pow給出了大量極端情況下的值的詳細信息。

類型算術base doubleR應該以“舍入到最近,連接到偶數”模式完成,但這確實取決於正確設置的編譯器和 FPU。

一元 + 和一元 - 返回數字或複數向量。如果沒有強製轉換,所有屬性(包括類)都會被保留:邏輯 x 被強製轉換為整數,並且名稱、暗淡和暗淡名稱會被保留。

二元運算符返回包含逐個元素運算結果的向量。如果涉及零長度向量,則結果的長度為零。否則,較短向量的元素將根據需要進行回收(當它們僅部分回收時,使用warning)。這些運算符包括+(用於加法)、-(用於減法)、*(用於乘法)、/(用於除法)和^(用於求冪)。

%%表示x mod y(“x modulo y”),即計算‘remainder’r <- x %% y, 和%/%表示整數除法,其中R使用“floored”整數除法,即q <- x %/% y := floor(x/y),如 Donald Knuth 所推廣,請參閱維基百科頁麵上的“模運算”,因此sign(r) == sign(y)。可以保證

x == (x %% y) + y * (x %/% y)

(直至舍入誤差)

除非y == 0,其中%%的結果是NA_integer_NaN(取決於參數的typeof),或者對於某些非finite參數,例如,當上述恒等式的RHS等於到Inf - Inf

如果任一參數為複數,則結果將為複數,否則如果一個或兩個參數為數字,則結果將為數字。如果兩個參數的類型均為 integer ,則 /^ 的結果類型為 numeric,對於其他運算符,其結果類型為整數(在 處發生溢出,返回為 NA_integer_ 帶有警告)。

確定結果屬性的規則相當複雜。大多數屬性都取自較長的參數。如果名稱與答案的長度相同,則將從第一個名稱複製,否則從第二個名稱複製。如果參數長度相同,則將從兩個參數複製屬性,當兩個參數中存在相同屬性時,第一個參數的屬性優先。對於時間序列,僅當係列兼容且使用時間序列的類和 tsp 屬性(如果兩者都相同時,則相同)時,才允許執行這些操作。對於數組(和數組結果),如果它是數組,則從第一個參數獲取維度和暗名稱,否則從第二個參數獲取。

S4方法

這些運算符是 S4 Arith 組泛型的成員,因此可以為它們單獨編寫方法,也可以為組泛型(或 Ops 組泛型)編寫方法,參數為 c(e1, e2)(缺少 e2)對於一元運算符)。

實施限製

R依賴於操作係統服務(以及它們的 FPU)進行浮點運算。在所有當前R平台使用 IEC 60559(也稱為 IEEE 754)算法,但這些標準中的某些內容是可選的。特別是,對以下方麵的支持:非正規的又名低於正常的數字(超出給定範圍的數字.Machine)在平台之間甚至在單個平台上的計算之間可能會有所不同。

另一個潛在問題是帶符號的零:在 IEC 60559 平台上有兩個零,其內部表示形式因符號而異。在可能的情況R將它們視為相同,但例如 C 代碼的直接輸出通常不會這樣做,並且可能輸出‘⁠-0.0⁠”(在 Windows 上是否這樣做取決於 Windows 版本)。一個地方在R可以看出差異在於除以零:1/xInf或者-Inf取決於零的符號x。另一個地方是identical(0, -0, num.eq = FALSE).

注意

所有涉及零長度向量的邏輯運算都具有零長度結果。

二元運算符有時被稱為函數,例如`&`(x, y) :請參閱Ops 中如何完成argument-matching 的說明。

**在解析器中被翻譯為^,但這多年來一直沒有記錄。它在 Becker 中顯示為索引條目等人(1988),指出幫助Deprecated但該頁麵實際上並未提及。盡管它在 S 中已被棄用了 20 年,但在R在2008。

例子

x <- -1:12
x + 1
2 * x + 3
x %%  3 # is periodic  2 0  1  2 0  1 ...
x %% -3 #  (ditto)    -1 0 -2 -1 0 -2 ...
x %/% 5
x %% Inf # now is defined by limit (gave NaN in earlier versions of R)

參考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

D. Goldberg (1991). What Every Computer Scientist Should Know about Floating-Point Arithmetic. ACM Computing Surveys, 23(1), 5-48. doi:10.1145/103162.103163.
Also available at https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html.

For the IEC 60559 (aka IEEE 754) standard: https://www.iso.org/standard/57469.html and https://en.wikipedia.org/wiki/IEEE_754.

On the integer division and remainder (modulo) computations, %% and %/%: https://en.wikipedia.org/wiki/Modulo_operation, and Donald Knuth (1972) The Art of Computer Programming, Vol.1.

也可以看看

sqrt 用於雜項,Special 用於特殊數學函數。

Syntax 用於運算符優先級。

%*% 用於矩陣乘法。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Arithmetic Operators。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。