符合IEEE754的不同系统中的浮点数是否相同?

时间:2017-11-20 06:35:49

标签: r postgresql precision

这与我最新的问题有关:What can I do about the difference between real numbers in R versus PostgreSQL?

我对精度问题和IEEE754标准知之甚少。我读了这个link,我从中引用(强调我的):

  

由于其广泛使用,电气和电子工程师协会用IEEE 754标准化了用于在存储器中存储浮点数的格式

对我而言,这意味着如果我在符合标准的两个不同系统中数字4104.694应该相等。但是,从我之前的问题来看,RPostgres似乎不同地代表了这个数字:

des_num <- 4094.694
sprintf("%.64f", des_num)
# "4094.6939999999999599822331219911575317382812500000000000000000000000"
psql_num <- RPostgreSQL::dbGetQuery(con, "select 4104.694;")
sprintf("%.64f", psql_num)
# [1] "4104.6940000000004147295840084552764892578125000000000000000000000000"

我是否希望在符合标准的不同系统中以完全相同的方式存储相同的浮点数?

1 个答案:

答案 0 :(得分:3)

我不知道R是否有精确的数字类型,但Postgres确实如此。 A = (1 + np.arange(12).reshape(3,4)) * 100 B = (1 + np.arange(18)).reshape(3,6) row_indices = [2, 0, 2] col_indices = [1, 2, 0, 2, 1, 1] for i, row_index in enumerate(row_indices): for j, col_index in enumerate(col_indices): A[row_index, col_index] += B[i, j] REAL列类型都提供精确的精确度see here。如果你正在使用Postgres作为脚本背后的数据存储,那么如果你使用实数或十进制,你应该能够存储来自R的东西,并在以后检索完全相同的东西。