为何两个逻辑相似的kthGrammar函数运行结果存在差异?
两个kthGrammar函数输出不一致的原因
二者的核心差异是父节点索引的计算逻辑,错误出在函数1的ceil(float(k)/2)写法:
- 32位
float类型遵循IEEE754标准,有效精度只有23个二进制位,只能精确表示绝对值不超过2^24(即16777216)的整数。当k值超过这个阈值时,将int类型的k强制转换为float的过程中就会出现精度丢失,得到的值和原始k值不一致,后续ceil(float(k)/2)计算得到的父节点索引自然是错误的。 - 你示例中的输入
k=417219134远大于16777216,转float时已经无法精确表示,因此函数1递归时的父节点索引从第一步就出现偏差,最终输出结果错误。 - 函数2全程使用整数运算计算父节点索引:奇数k用
(k+1)/2、偶数k用k/2,全程没有浮点数运算,不存在精度损失,因此结果正确。
内容的提问来源于stack exchange,提问作者ABHISHEK SINHA
相关产品推荐
相关产品推荐

