解决浮点序列管理中的精度挑战

Addressing Precision Challenges in Floating-Point Sequence Management

提问人:P Zulfikarova 提问时间:10/30/2023 最后编辑:P Zulfikarova 更新时间:10/31/2023 访问量:71

问:

我面临着一个与在 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 次后,浮点数的小数部分开始被填满,从而导致序列值不准确。

我正在寻找有关如何解决此问题的建议,并找到一种更强大的方法来组织序列值,而不会遇到与浮点数据类型相关的精度问题。任何见解或替代方法将不胜感激。

sql-server 浮点序列

评论

2赞 Dale K 10/30/2023
不要使用 float,使用 int 并重新排序所有项目,而不是不断减少数量。
0赞 siggemannen 10/30/2023
将数值与要使用的精度一起使用
1赞 siggemannen 10/30/2023
你在做某种树结构吗?
0赞 P Zulfikarova 10/30/2023
@siggemannen更像是一个链表。当在同一级别(例如在同一文件夹中)从一个地方移动到另一个地方时,我们需要更改项目的顺序。
2赞 Eric Postpischil 10/30/2023
这不是一个浮点问题。任何固定宽度类型(无论是浮点数、整数还是非数字)都无法满足对更多位日益增长的需求。每次将一个序列放在另外两个序列之间时,都需要比所需的父序列多一个位。您需要另一种识别序列的方法(包括有时可能更改/重置标识符)或可变长度类型,例如不断增长的字符串。

答:

0赞 David Browne - Microsoft 10/30/2023 #1

您需要一个过程来分散值以创建空间。如果他们开始积累大量的精确数字,只要有足够的空间,这很好。

因此,使用查询定期重写序列,例如使用 ROW_NUMBER() 将所有值设置为整数。

当您发现新的序列值等于您尝试查找值之一时,也可以触发此值。

评论

2赞 Eric Postpischil 10/31/2023
将所有值加倍对精度问题没有影响,因为浮点精度是相对于有效数而不是指数的。
0赞 David Browne - Microsoft 10/31/2023
没错,因为浮子的密度会随着浮子的变大而变小。