以下代码产生令人惊讶的结果:
x<-round(c(.1,-.1))
x==0 #TRUE TRUE
x<0 #FALSE FALSE
formatC(x) #"0", "-0"
x通过了我知道如何做为零的每项测试,但是以某种方式formatC知道它曾经是负数。结转来自哪里?
答案 0 :(得分:2)
浮点数专用于数字的符号。在舍入为0的情况下,round()
函数不会翻转该标志。使用浮点数时,您可以拥有a signed zero值。
您可以使用sprintf
查看数字字节的十六进制值表示形式。例如
x <- c(.1,-.1)
sprintf("%a", x)
# [1] "0x1.999999999999ap-4" "-0x1.999999999999ap-4"
sprintf("%a", round(x))
# [1] "0x0p+0" "-0x0p+0"
在此表示形式中,带符号的位以字符串中是否存在“-”表示。我们可以看到,四舍五入的版本使符号保持不变。
出于所有意图和目的,-0就像普通的0。您可以通过在结果中加0来消除负数。
formatC(round(x)+0)
# [1] "0" "0"
但是实际上这只是在发生,因为您正在使用低级formatC
函数。显示数字时,即使R本身也不区分0和-0。因为R试图隐藏此细节,所以我认为您无法在R中区分两者。您必须编写自己的C / C ++代码来亲自检查符号数字。
有关非R的更多讨论,请参见:Negative Zero in C