根据 docs ,“在典型的 R 平台上,最小的正 double 约为 5e-324
。”给定一个 double 向量,其值高于、接近和低于此限制:
library(tibble)
small_vec <- c(4e-300, 4e-324, 4e-350)
small_df <- data.frame(x = small_vec)
small_tibble <- tibble(x = small_vec)
打印 small_vec
和 small_df
给出了我所期望的:
small_vec
#> [1] 4.000000e-300 4.940656e-324 0.000000e+00
small_df
#> x
#> 1 4.000000e-300
#> 2 4.940656e-324
#> 3 0.000000e+00
第二个值不太正确,我隐约理解是由于 float 异常。第三个数字下溢到 0
。美好的。但是作为小标题打印,
small_tibble
#> # A tibble: 3 × 1
#> x
#> <dbl>
#> 1 4 e-300
#> 2 Inf.e-324
#> 3 0
创建于 2022-10-19 reprex v2.0.2
我被 Inf.e-324
迷住了——Inf
的想法带有指数和小数点。这是什么意思?或者它可能是 tibble 包中的错误?
最佳答案
(评论有点长。)
当然看起来像是一个错误,但我认为它不在 tibble
本身 中,而是在下面的 pillar
包中。 图书馆(支柱); pillar_shaft(small_vec)
显示相同的病理。向下挖掘:查看pillar:::format.pillar_shaft_decimal()
,它使用了这个对象的$sci
组件。该组件看起来很可疑:
> pillar_shaft(small_vec)$sci
[harmless-looking stuff]
$lhs
[1] "4" "Inf" "0"
$lhs_zero
[1] FALSE FALSE TRUE
$rhs
[1] 0 NaN 0
[harmless-looking stuff]
所以我们可能必须看看 pillar_shaft
在转换过程中做了什么。
具体在
pillar:::pillar_shaft_number_attr(small_vec, NULL, NULL)
它指向pillar_shaft_number
,似乎通向
pillar:::split_decimal(small_vec, sigfig = 3, digits = NULL)
但是,奇怪的是,那个看起来不错,所以我一定是在某个地方失去了情节。
关于r - 接近下溢限制的数字在 tibble 中显示为 `Inf.e-324`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74131047/