r - 接近下溢限制的数字在 tibble 中显示为 `Inf.e-324`?

标签 r floating-point tibble underflow

根据 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_vecsmall_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/

相关文章:

python - 从 Python 或 R 中的大数据集中获取高度相关对的有效方法

c - 为什么这个 float 的值与它设置的值不同?

java - 在 Java 中抛出 ArithmeticException

r - 如何根据一天中的时间从一个数据帧中派生出 2 个数据帧?

r - 将r中的列表写入excel文件

r - 拆分和配对两列的值

r - 如何避免 ggplot2 条形图中条形之间的间距不均匀?

c - 将字节重新解释为 C 中的 float (IEEE 754 单精度二进制)

r - 整洁 : create key without rowwise()?

r - 将 "loadings"对象转换为数据帧 (R)