为什么`ceiling`和`floor`的默认返回类型为数字?

时间:2015-08-19 20:09:45

标签: r arithmetic-expressions

为什么以下所有"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",那么接下来会发生什么?

1 个答案:

答案 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在给定整数输入时不返回整数。