小数学的东西:正方形和圆整

时间:2013-09-27 23:43:21

标签: scala math floating-point integer-arithmetic

scala中的

,给出整数d& x,我会有一个布尔表达式,当且仅当y = (x^2 - 1) / d^2是正方形时才应该为真。

我试过了:

(Math.sqrt((x * x - 1) / (d * d)).toInt * Math.sqrt((x * x - 1) / (d * d)).toInt == ((x * x - 1) / (d * d)))

但是3元组(x = 2, d = <all values tested>, y = 0.0)似乎总是我的问题的答案,这显然是错误的。 我认为我的错误来自舍入:如果x = 2,d = 4(例如),则x * x - 1 == 3d * d == 16,因此除法会导致0

你知道什么是好表达吗?

2 个答案:

答案 0 :(得分:1)

如果n是圆方,则Math.sqrt(n).toInt == Math.sqrt(n)。在你的情况下:

(Math.sqrt((x * x - 1) / (d * d)).toInt == Math.sqrt((x * x - 1) / (d * d)))

但在此之前,您需要确保x和d 双打。 尝试REPL:

scala> val x = 1
scala> val d = 3
scala> x/d

Int除以Int将得到舍入的Int,因此您将sqrt应用于零。

同样由于浮点运算,你可能想要这样比较:

(Math.sqrt((x * x - 1) / (d * d)).toInt - Math.sqrt((x * x - 1) / (d * d))) <= ZERO

其中ZERO被一个非常小的数字替换,如0.00001

答案 1 :(得分:0)

因为这是整数除法,所以你要检查((x*x-1)/(d*d)).toInt是否是一个完美的正方形。您可以先将所有内容转换为双打,但如果您想保留整数领域,请检查该除法是否应该生成整数:

( x*x-1 % d*d == 0 ) && Math.sqrt(y).toInt == Math.sqrt(y)