В своем коде я начал замечать, что одни и те же начальные условия приводят к разным результатам.
После нескольких часов охоты я нашел, где возникает ошибка.
У меня есть простая функция, которая принимает несколько параметров, один из которых v
. v
— двойник. Одним из вычислений внутри этой функции является Math.pow(v, 2)
.
Написав некоторый код, записывающий все входные данные этой функции и все промежуточные вычисления внутри этой функции, я обнаружил, что v
всегда равно -54.35178459279
, но иногда
Math.pow(-54.35178459279, 2) = 2954.116488421044
а иногда (смотрите концовку 3)
Math.pow(-54.35178459279, 2) = 2954.1164884210443
Какой? В чем дело?
Я пытался запустить Math.pow(-54.35178459279, 2)
в бесконечном цикле, чтобы увидеть, дает ли он иногда другой результат. Ну, это не так.
Мои единственные догадки пока что либо:
а. Мой отладчик не показывает все цифры в числе
б. Что, несмотря на то, что отладчик показывает то же самое представление для v
s, базовый двойник scala немного отличается.
Для тех, кто действительно хочет пример, это действительно лучшее, что я могу сделать:
val precision = 1000000000000.0
def step(v: Double) = {
val newV = Math.round(calcV(v)*precision) / precision
step(newV)
}
def calcV(v: Double) = Math.pow(v, 2)
Только что получил ключ:
scala> -54.35178459279 * -54.35178459279
res0: Double = 2954.1164884210443
scala> Math.pow(-54.35178459279, 2)
res0: Double = 2954.116488421044
v
, которые привели к разным квадратным значениям? - person rgettman   schedule 18.11.2015v
с высокой точностью или попробуйте создатьSet
из всех разныхv
и посмотреть, насколько он велик. Или кэшируйте последнее значениеv
и посмотрите, изменится ли оно. - person djechlin   schedule 18.11.2015v
идентичны в кеше (cache(0) == cache(1) = true
) - person Anton   schedule 18.11.2015