为什么我得到NaN以获得应该存在的结果

时间:2017-11-20 16:42:04

标签: r

我有以下用于在R

中生成随机变量的代码
theta<-1

n<-1000  
u<-runif(n)
H<-(-theta*log(1-u)^(1/3))

我的问题是,当我知道答案是真实的时,我得到的输出是输出的NaN 1000倍。我定义H的方式有问题吗?

1 个答案:

答案 0 :(得分:3)

按顺序:

u = runif(n) # between 0 and 1
1 - u        # between 0 and 1
log(1 - u)   # negative real
log(1 - u) ^ (1/3)  # NaN because...

来自help("^") “用户有时会对返回的值感到惊讶,例如为什么(-8)^(1/3)NaN。对于双输入,R对所有人使用IEC 60559算法平台,以及用于^运算符的C系统函数pow。相关标准定义了许多极端情况下的结果。特别是,上述示例中的结果是C99标准规定的。“

因此,每当您将x提升为非整数幂时,如果NaN,答案将为x < 0。获得负实际结果的一个选择是将abs(x)提升为非整数幂,然后使结果为负。 (更一般地说,我们乘以sign(x),因此它仍适用于正x。)

sign(log(1 - u)) * (abs(log(1 - u)) ^ (1/3)) # Negative real, based on your inputs

-theta * sign(log(1 - u)) * (abs(log(1 - u)) ^ (1/3)) # Maybe what you want?