Недетерминированный Math.pow(x, 2) [Scala]

В своем коде я начал замечать, что одни и те же начальные условия приводят к разным результатам.

После нескольких часов охоты я нашел, где возникает ошибка.

У меня есть простая функция, которая принимает несколько параметров, один из которых 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) в бесконечном цикле, чтобы увидеть, дает ли он иногда другой результат. Ну, это не так.

Мои единственные догадки пока что либо:

а. Мой отладчик не показывает все цифры в числе

б. Что, несмотря на то, что отладчик показывает то же самое представление для vs, базовый двойник 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

person Anton    schedule 18.11.2015    source источник
comment
Для этого вам может понадобиться SSCCE.   -  person djechlin    schedule 18.11.2015
comment
Как вы рассчитали или присвоили значения v, которые привели к разным квадратным значениям?   -  person rgettman    schedule 18.11.2015
comment
Наивные догадки отладчика: попробуйте распечатать v с высокой точностью или попробуйте создать Set из всех разных v и посмотреть, насколько он велик. Или кэшируйте последнее значение v и посмотрите, изменится ли оно.   -  person djechlin    schedule 18.11.2015
comment
stackoverflow.com/ вопросы/26746623/?   -  person Johny T Koshy    schedule 18.11.2015
comment
@djechlin На самом деле, я кэширую числа. Два v идентичны в кеше (cache(0) == cache(1) = true)   -  person Anton    schedule 18.11.2015
comment
@johny выглядит правильно. Закрытие как обман, откройте снова, если вы найдете доказательства o/w.   -  person djechlin    schedule 18.11.2015
comment
Нет, это не так. Я скачал java 8u66 и все равно получаю ту же ошибку. Это версия на этой странице bugs.java.com/bugdatabase/view_bug.do? bug_id=8063086.   -  person Anton    schedule 18.11.2015