【问题标题】:Mathematically correct result from Math.sqrt for int arguments?Math.sqrt 对于 int 参数的数学正确结果?
【发布时间】:2019-09-15 10:58:54
【问题描述】:

给定一个int x,(int)Math.sqrt(x) 是否保证返回数学上正确的结果,对于所有非负的x,截断为整数(即​​floor(sqrt(x)) 的精确数学值)?

【问题讨论】:

  • @BeeOnRope 你介意提供一个错误结果和正确结果的例子吗?
  • @ngueno 当然,(int)Math.sqrt(10) 给出 3 这是正确的结果,任何其他结果都是不正确的结果。我的意思是“切掉任何小数部分的确切平方根”,即。 floor() 的确切结果。
  • @jasli 正确回答了这个问题,然后删除了他们的回答。简短的回答是是的。拜托,jasli,你会取消删除你的答案吗?关于它不申请long 的评论无关紧要,因为所有int 值都可以用double 精确表示,而long 则不正确。
  • @DawoodibnKareem - 答案是正确的,但我认为推理不是,或者至少它不完整?特别是,他们根本没有提到“所有 int 值都可以用 double 精确表示”部分。我同意删除是仓促的!关于long 的观察适用,因为您可以在该答案中替换long 而不会产生任何矛盾,因此如果在这种情况下答案失败,则推理无法完成。
  • 没错。这就是重点。

标签: java floating-point square-root


【解决方案1】:

根据 Java 文档,Math.sqrt() 返回“最接近参数值的真正数学平方根的双精度值”,并且将 double 转换为 int 等效于非负数的地板(对于负数,floor() 向负无穷大截断,同时向 0 截断)。我能想到的唯一情况是(int)Math.sqrt(x) 不能完成这项工作,如果平方根的结果太大而无法放入int

其他链接

https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#sqrt(double)

【讨论】:

  • 我不认为这个答案是完整的,因为你可以用long 代替int 写相同的答案,但我知道long 它失败了,例如, 4503599761588224。答案总是可以放在int 中,因为sqrt 的结果永远不会大于参数(从 0 到 1 的小数值除外,它不适用于 int 参数)。
  • 这是一个很好的观点,很抱歉我在原始问题中错过了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多