Ошибка математического домена при создании отрицательного числа - PullRequest
0 голосов
/ 02 декабря 2019

Я делаю программу для имитации европейского звонка.

Произошла ошибка, когда я генерирую sqrt журнала и в результате получаю отрицательное число. Я знаю, что в Java это не вызовет никаких проблем, но в Python он дает мне «Math domain error».

Ошибка в этой строке.

x = v1 * math.sqrt(-2.0 * math.log(s) / s) #The -2.0 doesnt work

Ответы [ 2 ]

1 голос
/ 02 декабря 2019

Поскольку вы говорите, что код хорошо работает в Java (предположительно, с использованием Math.sqrt), мы можем исключить комплексные числа. Стандартная библиотека Java не имеет типа данных комплексного числа;Вы могли бы использовать сторонний класс библиотеки или написать свой собственный, но трудно представить, что вы упустили бы это при попытке перевести код на Java. Я прихожу к выводу, что вычисление должно иметь результат с действительным номером.

Чтобы это было правдой, это должен быть случай, когда 0 math.log(s) отрицательна, что означает -2.0 * math.log(s) положительно, и вычисление имеет действительное значение.

Таким образом, проблема, вероятно, в том, что s имеет неправильное значение. Из истории редактирования я вижу, что значение s вычисляется следующим образом:

        v1 = 2.0 * random.randint(0,1) - 1.0
        v2 = 2.0 * random.randint(0,1) - 1.0
        s = v1*v1 + v2*v2

Здесь v1 и v2 - либо -1, либо 1, поскольку randint(0, 1) генерирует либо0 или 1. В любом случае, v1*v1 и v2*v2 оба равны 1, и, следовательно, s равен 2. Это не в области 0 Так что вам нужно вернуться кучебник и / или реализация Java, чтобы убедиться, что s рассчитывается и используется правильно.

1 голос
/ 02 декабря 2019

Вы берете квадратный корень из отрицательного числа, поэтому вы ожидаете работать со сложными числами. Вы должны импортировать и использовать cmath https://docs.python.org/3.8/library/cmath.html

import cmath
...
x = v1 * cmath.sqrt(-2.0 * math.log(s) / s)

Обратите внимание, что я не проверял логику или функцию вашей программы, поэтому вопрос о том, действительно ли результат имеет смысл, является другим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...