2013-09-27 4 views
0

в Скале, учитывая целые 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.

Знаете ли вы, что такое хорошее выражение?

+1

Не уверен, что вы хотите. Приведите пример, где вы должны вернуть true, а другое - false. –

+0

привет; y = 16 => true, y = 64 => true, но y = 63 => false – lolveley

+0

Что такое 'x', что такое' d', и как вы добираетесь до 'y = 16 => true' и т. д. .? – Teepeemm

ответ

1

если n - круглый квадрат, то Math.sqrt (n) .toInt == Math.sqrt (n). В вашем случае:

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

Но прежде чем сделать это, вы должны убедиться, что х и d являются двойники. Попробуйте в РЕПЛ:

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

0

Поскольку это целочисленное деление, вы проверяя, является ли ((x*x-1)/(d*d)).toInt идеальной площадью. Сначала вы можете преобразовать все в двойные, но если вы хотите остаться в области целых чисел, убедитесь, что в результате деления должно быть целое число: