Почему следующие все "numeric"
?
class(ceiling(3))
class(ceiling(3L))
class(ceiling(3.1))
class(floor(2))
class(floor(2L))
class(floor(2.1))
Это похоже на одну арифметическую операцию, результат которой однозначно является целым числом (в отличие, скажем, от возведение в степень), независимо от входных данных (передача комплексного числа является ошибкой).
Я попытался найти ответ, связанный с базовым кодом C
, но на самом деле ничего не добился.
Я также узнал, что, хотя "%/%"(x,y)
также всегда должно быть целым числом, class
результатов зависит от типов ввода, например. 5%/%2
, 6%/%2
и 6%/%2L
все numeric
, но 5L%/%2L
и 6L%/%2L
оба integer
(кое-что об этом упоминается в ?Arithmetic
); это тоже не имеет смысла для меня, но, по крайней мере, это задокументировано.
Есть ли простая причина для возврата объектов numeric
из ceiling
и floor
? Если бы речь шла о неэффективности из-за повторного приведения (что может быть в случае целочисленного деления), я бы ожидал, что class(ceiling(3L))
будет "integer"
, так что же происходит?
?mode
Режимы имеют тот же набор имен, что и типы (см. typeof), за исключением того, что типы integer и double возвращаются как числовые... - person Alex W   schedule 19.08.2015ceiling(Inf)
и не получить в результатеNA
? - person eddi   schedule 19.08.2015as.integer(Inf)
былNA
, так что, возможно, ты что-то понял... - person MichaelChirico   schedule 19.08.2015ceiling(3L)
не должно быть приведения. Возможно, вы захотите уточнить, как работаютC
/C++
версииceil
, когда задано целое число. - person MichaelChirico   schedule 19.08.2015x<-list(1,1L); lapply(x,ceiling)
. - person MichaelChirico   schedule 19.08.2015ceiling
для целого числа должно возвращать число с плавающей запятой. - person eddi   schedule 20.08.2015atomic
(целочисленным, числовым, логическим и т. д.); поэтому вы не можете использовать общую систему диспетчеризации, но вам нужен какой-то оператор if внутри реализации по умолчанию, чтобы проверить, является ли он целым или двойным. Это добавляет условный переход (= потеря производительности) внутри функции, которая должна быть максимально быстрой (представьте, что вы используете ее миллионы раз...) - person digEmAll   schedule 20.08.2015ceilingIntAware <- function(x) if(is.integer(x))x else ceiling(x)
- person digEmAll   schedule 20.08.2015