为什么以下所有"numeric"
?
class(ceiling(3))
class(ceiling(3L))
class(ceiling(3.1))
class(floor(2))
class(floor(2L))
class(floor(2.1))
这似乎是一个算术运算,其结果明确地是一个整数(不像是exponentiation),无论输入如何(传递复数的错误)。
我试着在底层的C
代码中找到相关的答案但是并没有真正到达任何地方。
我还了解到,虽然"%/%"(x,y)
也应该始终是一个整数,但结果的class
取决于输入类型,例如5%/%2
,6%/%2
和6%/%2L
都是numeric
,但5L%/%2L
和6L%/%2L
都是integer
(有关此事的提及在?Arithmetic
);这对我来说也没有意义,但至少它是有记录的。
从numeric
和ceiling
返回floor
个对象是否有一个简单的原因?如果由于重新铸造而导致效率低下(整数除法可能就是这种情况),我希望class(ceiling(3L))
为"integer"
,那么接下来会发生什么?
答案 0 :(得分:6)
我知道这是ceiling
设计为返回numeric
的原因,但以下示例显示了ceiling
的限制实际上返回了一个整数:
options(digits = 15)
.Machine$integer.max + 1.4
#[1] 2147483648.4
ceiling(.Machine$integer.max + 1.4)
#[1] 2147483649
as.integer(ceiling(.Machine$integer.max + 1.4))
#[1] NA
#Warning message:
#NAs introduced by coercion
那就是说,我没有理由看到为什么ceiling
在给定整数输入时不返回整数。