【问题标题】:largest precision error on an integer greater than 2^53 stored as a double - How to store UINT64 in BigQuery大于 2^53 的整数的最大精度错误存储为双精度 - 如何在 BigQuery 中存储 UINT64
【发布时间】:2017-05-20 18:13:44
【问题描述】:

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

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

【问题讨论】:

  • 嗨梅丽莎 - 我很高兴浮动精度足够(给出公认的答案) - 但我仍然很好奇 - INT64 会给你精确和正确的结果吗? (除了为大的积极因素显示消极因素?)
  • 嗨 Felipe - 是的。
  • 嗨,Melissa - 花了一些时间,但我们现在有了 NUMERIC 类型! cloud.google.com/bigquery/docs/reference/standard-sql/…
  • 菲利普太棒了!
  • 嗨,Melissa - 这需要一些时间,但 BigQuery 提供了。很高兴看到你还在这里:)。您会接受下面为未来读者提供的新答案吗?谢谢!

标签: types integer double google-bigquery


【解决方案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
【解决方案2】:

浮点数之间的差距随着数字变大而增加。

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

  • 最大的有限值为(2 − 2−52)×21023(约1.8×10308)。
  • 第二大值为(2 − 2−51)×21023
  • 他们相差2971(约2.0×10292)。
  • 因此通过四舍五入,最大误差是步长的一半,所以您的问题的答案是 2970(大约 1.0×10292 )。

关于最大264的双精度浮点数范围:

  • 264 可以在 DP FP 中精确表示。
  • 前一个(较小的)数字是 18446744073709549568。
  • 他们的差是 2048。
  • 因此,将 uint64 转换为 float64 时,最大舍入误差为 ±1024。

【讨论】:

    猜你喜欢
    • 2015-06-05
    • 2016-01-06
    • 2017-10-26
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2015-11-28
    • 2011-08-05
    • 2014-09-09
    相关资源
    最近更新 更多