取整后看似相同的浮点值出现除法结果异常问题求助
R语言中round后数值显示相同但哈希不同、除法结果相反的异常
问题现象
生成圆上点数据并对x、y保留1位小数取整后,第25和26行的x显示都是0、y都是1,但y1/x1返回Inf,y2/x2返回-Inf;调用identical(x1, x2)和identical(y1, y2)都返回TRUE,但用digest::digest计算MD5哈希时x1和x2却不一样。
复现代码
# Function to create circle circleFun <- function (center = c(0, 0), diameter = 1, npoints = 100) { r = diameter/2 tt <- seq(0, 2 * pi, length.out = npoints) xx <- center[1] + r * cos(tt) yy <- center[2] + r * sin(tt) return(data.frame(x = xx, y = yy)) } # Circle data circle1 <- circleFun(c(0, 0), 2, npoints = 100) circle1$x <- round(circle1$x, 1) circle1$y <- round(circle1$y, 1) x1 <- circle1$x[25] y1 <- circle1$y[25] x2 <- circle1$x[26] y2 <- circle1$y[26] y1/x1 # Inf y2/x2 # -Inf identical(x1, x2) # TRUE identical(y1, y2) # TRUE
哈希验证结果
> digest::digest(x1, algo = "md5") [1] "908d1fd10b357ed0ceaaec823abf81bc" > digest::digest(x2, algo = "md5") [1] "b01ec9609569aecde321d7dd2674f6e1" > digest::digest(y1, algo = "md5") [1] "6717f2823d3202449301145073ab8719" > digest::digest(y2, algo = "md5") [1] "6717f2823d3202449301145073ab8719"
原因解析
这是浮点数精度与R语言相关函数特性共同导致的:
- 正负零的差异:x1是正零(+0),x2是负零(-0)。浮点数规范中,+0和-0数值等价,但底层二进制存储不同,因此哈希值不同。
- 打印与显示的局限:R在打印浮点数时,会把+0和-0统一显示为0,无法直观区分。
identical的判断逻辑:identical()默认忽略浮点数的正负零差异,所以返回TRUE。- 除法的符号规则:正数除以+0得到
Inf,除以-0得到-Inf,这就是两个除法结果相反的核心原因。
可以通过以下代码验证:
sign(x1) # 返回1,代表正零 sign(x2) # 返回-1,代表负零 sprintf("%.20f", x1) # 查看底层精确值 sprintf("%.20f", x2)
内容的提问来源于stack exchange,提问作者JAQuent
相关产品推荐
相关产品推荐

