存储为double的大于2 ^ 53的整数上的最大精度错误 - 如何在BigQuery中存储UINT64

时间:2017-01-06 02:23:58

标签: types integer double google-bigquery

存在于double中的大于2 ^ 53的正整数上的最大精度误差是多少? 换句话说,对于从2 ^ 53 + 1到max(double)的所有正整数,实际整数与double值之间的最大精度差异将是什么。

关于我为什么问的一个小背景: 我正在从pubsub读取SNMP计数器并将它们写入BigQuery。计数器是UINT64,但BigQuery的整数数据类型是INT64。所以我目前在我的BQ架构中使用FLOAT。如果计数器在数百个值中偏离了一些值,那对我的用例来说不会有问题。除非在BQ方面有另一种选择(不涉及使用字符串!)

2 个答案:

答案 0 :(得分:1)

2018更新:BigQuery现在具有NUMERIC类型。

从我到目前为止收集到的内容:

  • 您应该能够将UINT64存储为INT64而不会丢失任何精度。
  • 64位值的算术并不取决于它们是否被解释为有符号或无符号(除法和模除外)。
  • 比较:您可以做(A - B> 0)而不是(A> B)。

从历史上看,Java还没有处理UINT64,并且有记录的解决方法:https://www.nayuki.io/page/unsigned-int-considered-harmful-for-java

知道用这些变通办法处理哪些案例会很有趣!

在BigQuery中:

#legacySQL
SELECT 9223372036854775818
-9223372036854775798    

#legacySQL
SELECT 9223372036854775807
9223372036854775807

#legacySQL
SELECT 9223372036854775818 - 9223372036854775807
11

答案 1 :(得分:1)

随着数字变大,浮点数之间的差距也会增大。

关于整个双精度浮点数范围:

  • 最大有限值为(2 - 2 -52 )×2 1023 (约1.8×10 308 )。
  • 第二大值是(2 - 2 -51 )×2 1023
  • 他们的差异是2 971 (约2.0×10 292 )。
  • 因此,通过舍入到最接近,最大误差是步长的一半,因此您的问题的答案是2 970 (约1.0×10 292 )。

关于双精度浮点数的范围,最多2 64

  • 2 64 可以在DP FP中准确表示。
  • 之前(较小)的数字是18446744073709549568。
  • 他们的区别是2048年。
  • 因此,在将uint64转换为float64时,最大舍入误差为±1024。