,给出整数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 == 3
和d * d == 16
,因此除法会导致0
。
你知道什么是好表达吗?
答案 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)