当前位置: 首页 > 知识库问答 >
问题:

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

广瑞
2023-03-14

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

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

共有2个答案

唐珂
2023-03-14

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

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

    < li >最大有限值为(22 < sup > 52 )×2 < sup > 1023 (约为1.8×10 308)。 < li >第二大值是(2251)×2 < sup > 1023 。 < li >两者相差2 971(约2.0×10 292)。 < li >因此,通过四舍五入,最大误差为步长的一半,因此您的问题的答案为2 970(约1.0×10 292)。

关于高达 264 的双精度浮点数范围:

  • 264 可以精确地用 DP FP 表示。
  • 上一个(较小的)数字18446744073709549568。
  • 他们的不同是2048年。
  • 因此,将 uint64 转换为 float64 时,最大舍入误差为 ±1024。
阮华美
2023-03-14

2018更新:BigQuery现在有了数值类型。

  • https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric-类型

从我目前收集的信息来看:

  • 您应该能够将 UINT64 存储为 INT64,而不会损失任何精度。
  • 64 位值的算术不取决于它们是被解释为有符号还是无符号(除法和模除外)。
  • 比较:而不是 (A

从历史上看,Java没有处理过UINT64,并且有一些方法可以解决这个问题:https://www.nayuki.io/page/unsigned-int-considered-harmful-for-java

很想知道哪些情况不能用这些变通方法处理!

在大查询中:

#legacySQL
SELECT 9223372036854775818
-9223372036854775798    

#legacySQL
SELECT 9223372036854775807
9223372036854775807

#legacySQL
SELECT 9223372036854775818 - 9223372036854775807
11
 类似资料:
  • 编辑:在评论中进行了一些讨论后,发现由于幸运地了解了浮点数是如何在C中实现的,我问了一些与我想问的不同的东西。 我想使用比更大的整数(对我来说是8个字节)(对我来说是8个字节),可能不会重复出现在数组或bigint库中。由于我的是16个字节,我认为只需切换类型就可以了。结果表明,即使可以表示更大的整数,你也不能在不失去精度的情况下进行操作——用这些更大的整数。所以不可能实现我想做的事情。实际上,正

  • 这是对前段时间已经回答的问题的进一步澄清:可以存储在双精度中的最大整数 顶部答案提到“最大整数,以便它和所有较小的整数都可以存储在IEEE 64位双精度中而不会失去精度。IEEE 64位双精度有52位尾数,所以我认为它是2^53: 因为: > < li> 253 1无法存储,因为开头的1和结尾的1之间有太多的零。 任何小于 2 53 的东西都可以存储,其中52 位明确存储在尾数中,然后指数实际上给

  • 问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。

  • 我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?

  • 我想要得到一个特定位置附近的所有商店,但似乎我有一个查询字符串的问题。我已经检查了postgis的版本是PostGIS2.5.2_2。我也检查过,看看经度和纬度是否有双精度。 我尝试将查询重写到不同的查询字符串中,但仍然得到相同的错误。 我的实体: 我的存储库接口: 在postgres数据库中工作,但在java应用程序中,它返回一个错误: psqlException:error:“:”处或附近的语

  • 当我试图从Spark dataframe收集数据时,我得到一个错误,说明 下面是StackTrace: 警告tasksetmanager:在stage 0.0中丢失任务1.0(TID 1,10..***,executor 0):java.lang.IllegalArgumentException:requirement:Decimal precision 39在scala.predef超过最大精度