"numeric"类型和"integer"的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"numeric"类型和"integer"的区别?相关的知识,希望对你有一定的参考价值。
参考技术A integer是整数,numeric浮点数,你运行一下as.integer(1.23)和as.numeric(1.23)就知道区别了为啥 `ceiling` 和 `floor` 的默认返回类型是数字?
【中文标题】为啥 `ceiling` 和 `floor` 的默认返回类型是数字?【英文标题】:Why is the default return type of `ceiling` and `floor` numeric?为什么 `ceiling` 和 `floor` 的默认返回类型是数字? 【发布时间】:2015-11-13 07:10:12 【问题描述】:为什么下面都是"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
中有提及);这对我来说也没有什么意义,但至少它是有记录的。
从ceiling
和floor
返回numeric
对象有简单的原因吗?如果是因为重铸导致效率低下(这似乎是整数除法的情况),我希望class(ceiling(3L))
是"integer"
,那么这是怎么回事?
【问题讨论】:
完全随机猜测 - 也许有人希望能够做到ceiling(Inf)
而不会得到 NA
?
@digEmAll 这只是事后的理由——谁在乎他为什么或如何到达那里。关键是想要按照他的建议去做并没有本质上的错误,而且整数上的ceiling
应该返回浮点数也没有内在的原因。
@eddi:当然没有错,但是如果你开始向天花板/地板添加一个重载只是为了取一个整数并返回自己(如果它不是无用的话......),你'将完成创建所有类型的无用函数,只是因为一个人不关心他如何得到一个整数列表和浮点数......好吧,如果你不关心那个,你为什么关心这个列表返回所有的上限数字而不是整数和数字?
@digEmAll 查看 joran 在下面 eddi 的回答中发布的链接。似乎有一个完全合理的地方需要我得到的灵活性。
@eddi:我基本上同意你的说法,但是,除了我关于这些功能的实用性的观点之外,我认为决定不实施这些变体背后还有一个技术原因。 AFAIK S3 通用函数不适用于atomic
类型(整数、数字、逻辑等);所以你不能使用通用调度系统,但你需要在默认实现中使用某种 if 语句来检查是整数还是双精度。这会在必须尽可能快的函数内添加条件跳转(=性能损失)(想象一下,如果您使用它数百万次......)
【参考方案1】:
我不知道这是否就是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
在给定整数输入时不返回整数。
【讨论】:
有点切线相关的是this。 @MichaelChirico:关于 joran 的链接,是的,seq
返回的类型似乎有点混乱……例如,seq(1L,length.out=6L)
返回数字,而 seq(1L,by=1L,length.out=6L)
返回整数……据说,也许这个特殊问题可以通过添加ceiling
的重载来解决(当然也可以通过其他方式......),但我的观点是整数上的上限/下限大多是无用的(从某种意义上说,你可以获得不做任何事情也一样)而且我不认为 R 开发人员有兴趣添加不必要的功能......
关于ceiling(double)
返回双精度的原因,我同意eddi认为整数大小限制可能是原因...
嗯,这只是抓住稻草 - 我认为丢失信息是一个更重要的问题;顺便说一句,我刚刚在谷歌上搜索了这个问题 - 显然它基本上出现在你能想到的每一种语言中,答案在任何地方都是一样的(以上)
@MichaelChirico 我很确定整数和实数在 fortran 中具有相同的大小 - 如果是这种情况,那么返回整数将非常有意义以上是关于"numeric"类型和"integer"的区别?的主要内容,如果未能解决你的问题,请参考以下文章
<TextInput keyboardType="numeric"/> 在本机反应中不起作用
SyntaxError:identifier starts immediately after numeric literal