为什么以下所有"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"
,那是怎么回事? 最佳答案
我不知道这是为什么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
不返回整数。