为什么以下所有"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%/%26%/%26%/%2L都是numeric,但是5L%/%2L6L%/%2L都是integer(有关这些内容,在?Arithmetic中提到了);这对我来说也没有任何意义,但至少已记录在案。

numericceiling返回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不返回整数。

10-08 08:24