簡體   English   中英

NA_real_ 和 NaN 的區別

[英]Difference between NA_real_ and NaN

當我使用.Internal(inspect())NA_real_NaN時,它返回,

> .Internal(inspect(NA_real_))
@0x000001e79724d0e0 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan
> .Internal(inspect(NaN))
@0x000001e797264a88 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan

似乎他們唯一的區別是 memory 地址。

但是,當我將NA_real_NaN強制轉換為字符時,它會返回,

> as.character(c(NaN, NA_real_))
[1] "NaN" NA

我知道它應該返回上述結果,因為NaN不能是字符,它將被強制轉換為"NaN"NA_real將被強制轉換為NA_character_ 但是考慮到他們的直覺是一樣的,R 怎么能為他們返回不同的結果呢?

提前感謝您的任何建議!

出色地。 首先,請記住NA是一個 R 概念,在 C 中沒有等價物。 因此,根據需要, NA需要在 C 中以不同方式表示。 .Internal(inspect())沒有做出這種區分的事實並不意味着它不是在其他地方做出的。 事實上,恰好.Internal(inspect())使用Rprintf打印值的內部雙浮點表示。 而且,實際上,R NA 在 C 類型中被編碼為 C 浮點類型中的 NaN 值。

其次,您觀察到“它們唯一的區別是 memory 地址。” - 所以呢? 至少在概念上,不同的 memory 地址完全足以區分 NA 和 NaN,不需要更多。

但事實上 R 通過不同的途徑區分這些值。 這是可能的,因為IEEE 754 雙精度浮點格式具有多種不同的 NaN 表示,並且 R 為 NA 保留了一個特定的表示:

static double R_ValueOfNA(void)
{
    /* The gcc shipping with Fedora 9 gets this wrong without
     * the volatile declaration. Thanks to Marc Schwartz. */
    volatile ieee_double x;
    x.word[hw] = 0x7ff00000;
    x.word[lw] = 1954;
    return x.value;
}

和:

/* is a value known to be a NaN also an R NA? */
int attribute_hidden R_NaN_is_R_NA(double x)
{
    ieee_double y;
    y.value = x;
    return (y.word[lw] == 1954);
}

int R_IsNA(double x)
{
    return isnan(x) && R_NaN_is_R_NA(x);
}

int R_IsNaN(double x)
{
    return isnan(x) && ! R_NaN_is_R_NA(x);
}

( src/main/arithmetic.c )

NA是一個統計數據完整性概念:“缺失值”的概念。 例如,如果您的數據來自填寫 forms 的人,則錯誤條目或缺失條目將被視為NA

NaN是一個數字計算概念:“不是數字”的東西。 例如 0/0 是NAN ,因為這個計算的結果是未定義的(但請注意 1/0 是Inf或無窮大,同樣 -1/0 是-Inf )。

R 在內部處理這些概念的方式不是您應該關心的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM