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

Types 存储为双精度的大于2^53的整数的最大精度错误-如何在BigQuery中存储UINT64,types,integer,double,google-bigquery,Types,Integer,Double,Google Bigquery,存储在double中大于2^53的正整数的最大精度错误是什么? 换句话说,对于从2^53+1到max(double)的所有正整数,实际整数与double值之间的最大精度差是多少 关于我为什么这么问的一些背景知识: 我正在从pubsub读取SNMP计数器并将其写入BigQuery。计数器为UINT64,但整数的BigQuery数据类型为INT64。所以我现在在我的BQ模式中使用FLOAT。对于我的用例来说,如果计数器被关闭了数百个值,这将不会是一个问题。除非在BQ端有另一种选择(不涉及使用字符串!

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

关于我为什么这么问的一些背景知识:
我正在从pubsub读取SNMP计数器并将其写入BigQuery。计数器为UINT64,但整数的BigQuery数据类型为INT64。所以我现在在我的BQ模式中使用FLOAT。对于我的用例来说,如果计数器被关闭了数百个值,这将不会是一个问题。除非在BQ端有另一种选择(不涉及使用字符串!)

2018更新:BigQuery现在具有数字类型


根据我目前收集的信息:

  • 您应该能够将UINT64存储为INT64,而不会丢失任何精度
  • 64位值的算术运算不取决于它们被解释为有符号还是无符号(除法和模除外)
  • 比较:代替(A>B),你可以做(A-B>0)
从历史上看,Java没有处理过UINT64,有文档记录的解决方法:

想知道哪些情况不能用这些变通方法处理是很有趣的

在BigQuery中:

#legacySQL
SELECT 9223372036854775818
-9223372036854775798    

#legacySQL
SELECT 9223372036854775807
9223372036854775807

#legacySQL
SELECT 9223372036854775818 - 9223372036854775807
11

2018更新:BigQuery现在具有数字类型


根据我目前收集的信息:

  • 您应该能够将UINT64存储为INT64,而不会丢失任何精度
  • 64位值的算术运算不取决于它们被解释为有符号还是无符号(除法和模除外)
  • 比较:代替(A>B),你可以做(A-B>0)
从历史上看,Java没有处理过UINT64,有文档记录的解决方法:

想知道哪些情况不能用这些变通方法处理是很有趣的

在BigQuery中:

#legacySQL
SELECT 9223372036854775818
-9223372036854775798    

#legacySQL
SELECT 9223372036854775807
9223372036854775807

#legacySQL
SELECT 9223372036854775818 - 9223372036854775807
11

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

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

  • 最大有限值为(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转换为浮点64时,最大舍入误差为±1024

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

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

  • 最大有限值为(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转换为浮点64时,最大舍入误差为±1024

还有一些其他操作可以区分有符号和无符号类型。还有一些其他操作可以区分有符号类型和无符号类型。还有你好,梅丽莎-我很高兴浮动精度足够了(给出了公认的答案)-但我仍然很好奇-INT64能给你精确和正确的结果吗?(除了显示大正片的负片?)嗨,菲利佩-是的,会的。嗨,梅丽莎-花了一些时间,但我们现在有了数字类型!太棒了,菲利佩!嗨,梅丽莎-这花了一些时间,但BigQuery提供了。很高兴看到你还在这里:)。你会接受下面的新答案吗?谢谢嗨,梅丽莎-我很高兴浮动精度足够了(给出了公认的答案)-但我仍然很好奇-INT64能给你精确和正确的结果吗?(除了显示大正片的负片?)嗨,菲利佩-是的,会的。嗨,梅丽莎-花了一些时间,但我们现在有了数字类型!太棒了,菲利佩!嗨,梅丽莎-这花了一些时间,但BigQuery提供了。很高兴看到你还在这里:)。你会接受下面的新答案吗?谢谢