提问人:P Zulfikarova 提问时间:10/30/2023 最后编辑:P Zulfikarova 更新时间:10/31/2023 访问量:71
解决浮点序列管理中的精度挑战
Addressing Precision Challenges in Floating-Point Sequence Management
问:
我面临着一个与在 SQL Server 中组织序列值相关的问题,并希望获得一些关于找到解决该问题的最佳方法的指导。问题来了:
我们在 SQL Server 中使用 float 数据类型来确定序列的值。当我们更改此序列中文件夹或文档的顺序时,我们使用公式来计算移动文件夹或文档在另外两个文件夹或文档之间的新序列值。我们使用的公式如下:
新序列值 =(上一个序列的值 + 下一个序列的值)/ 2
因此,如果要在序列值为 1 和 2 的两个文件夹之间移动文件夹,则新的序列值将为:
(1 + 2) / 2 = 1.5
(1.5 +2) / 2 = 1.75
(1.75 + 2) / 2 = 1.875 ...
但是,我们遇到了这个公式的问题。在移动项目大约 14 次后,浮点数的小数部分开始被填满,从而导致序列值不准确。
我正在寻找有关如何解决此问题的建议,并找到一种更强大的方法来组织序列值,而不会遇到与浮点数据类型相关的精度问题。任何见解或替代方法将不胜感激。
答:
0赞
David Browne - Microsoft
10/30/2023
#1
您需要一个过程来分散值以创建空间。如果他们开始积累大量的精确数字,只要有足够的空间,这很好。
因此,使用查询定期重写序列,例如使用 ROW_NUMBER() 将所有值设置为整数。
当您发现新的序列值等于您尝试查找值之一时,也可以触发此值。
评论
2赞
Eric Postpischil
10/31/2023
将所有值加倍对精度问题没有影响,因为浮点精度是相对于有效数而不是指数的。
0赞
David Browne - Microsoft
10/31/2023
没错,因为浮子的密度会随着浮子的变大而变小。
评论