Mat*_*ias 4 algorithm floating-point binary-search numerics
即使它可以是任意大,使用二分查找也很容易找到一个整数:首先猜测数量级,然后继续划分区间。 这个答案描述了如何找到任意有理数。
设置好场景后,我的问题是类似的:我们如何猜测 IEEE 754 浮点数?假设它不是 NaN,但其他一切都是公平的游戏。对于每次猜测,您的程序都会被告知所讨论的数字是更高、相等还是更低。尽量减少最坏情况下所需的猜测次数。
(这不是一项家庭作业。不过,如果结果证明有一个有趣的答案,而不仅仅是“通过大量的特殊情况处理来解决浮点数值困难。”,我可能会将其作为一项作业。)
编辑:如果我更善于搜索,我可以找到答案——但这只有在你已经知道重新解释int有效的情况下才有效(有某些警告)。所以就留下这个吧。感谢哈罗德的精彩回答!
IEEE-754 64 位浮点数实际上是 64 位表示形式。此外,除了 NaN 值之外,正值的浮点比较和整数比较没有区别。(也就是说,符号位未设置的两个位模式将产生相同的比较结果,无论将它们比较为int64_t或double,除非其中一个位模式是浮点 NaN-。)
这意味着您可以通过每次猜测一位来在 64 次猜测中找到一个数字,即使该数字是 ±∞。首先将数字与 0 进行比较;如果目标是“较小”,则按照与下面相同的方式产生猜测,但在猜测之前否定它们。(由于 IEEE-754 浮点数是符号/数值,因此您可以通过将符号位设置为 1 来对数字取反。或者您可以进行正位模式重新解释,然后浮点对结果取反。)
之后,从最高位值开始,一次猜测一位。如果数字大于或等于猜测值,则将该位设置为 1;如果数字较小,则将该位设置为 0;并继续下一点,直到没有更多为止。要构造猜测,请将位模式重新解释为double.
有两个注意事项:
通过比较测试无法区分±0。这意味着,如果你的对手希望你区分它们,他们将必须为你提供一种方法来询问与 -0 是否相等,并且在你明显确定数字为 0 后,你必须使用该机制(这将发生在第 64 次猜测时)。这将增加 1 个猜测,总共 65 个。
如果您确信目标不是 NaN,那么就没有其他问题。如果它可能是 NaN,则需要小心比较方式:如果您总是问“X 是否小于这个猜测?”,事情就会顺利进行,因为 NaN 比较将始终返回 false。这意味着,在连续 11 次回答“否”之后(不包括建立符号的那个),您会发现自己猜测的是 ∞,并假设如果数字不小于 ∞,则它一定相等。然而,仅在这种情况下,您还需要显式测试是否相等,因为如果目标是 NaN,则结果也为 false。这不会在计数中添加额外的猜测,因为它总是会在 64 次猜测用完之前很久发生。