2016-07-13 16 views
0

При попытке решить проблему оптимизации, я постоянно получаю:В чем разница между делением и возведением в степень для компьютера?

RuntimeWarning: divide by zero encountered in divide 

Хотя аналитический писать 1/х и х^(- 1) одно и то же, переписывание своей функции, заменяя каждое подразделение как показанный, решил мою проблему.

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

EDIT:

Я решение проблемы с участием нанометровых масштабов. Полная ошибка, которую я получал, составляет:

RuntimeWarning: divide by zero encountered in divide 
    term = alpha/w 

где альфа - некоторая константа, а w> 0 - длина. Величины w, которые я ожидаю, имеют порядок 1е-9 или меньше, а альфа порядка 0,1.

Тем не менее, проблема решена. На самом деле я удивлен, что такое простое изменение в коде решает все, и, следовательно, вопрос.

EDIT 2:

Я решил проблему, написав:

term = alpha * w**(-1) 

Я знаю ** равен экспоненциации в Python.

+0

exponentiation = повторное умножение (например, инструкция 'mul'). раздел = 'div' инструкция, в основном. –

+1

@MarcB Это не совсем объясняет это в этом случае, так как не сразу видно, как вы повторяете что-то -1 раз. –

+1

Я не уверен, как использование exponentiation вместо деления может исправить вашу проблему, если вы работаете на одних и тех же данных. '0 ** -1' дает' ZeroDivisionError' так же, как '1/0'. Я хотел бы отметить, что ни один из них не дает точно такое же сообщение об ошибке, которое вы описываете, поэтому, возможно, это проблема XY. Можете ли вы дать более подробную информацию (и, возможно, некоторый код), показывающую, что вы на самом деле делаете? – Blckknght

ответ

1

Это ваша проблема:

>>> alpha = 1 
>>> w = 2 
>>> term = alpha/w 
>>> term 
0 


>>> term = alpha * w **(-1) 
>>> term 
0.5 
>>> 
>>> term = float(alpha)/w 
>>> term 
0.5 

В первом примере, вы делаете целочисленное деление, которое округляется до 0 Во втором примере вы неявно конвертируете в float, выполняя возведение в степень. Третий пример показывает, что вы можете получить правильный результат с делением, преобразуя любое значение в float

+0

Я не знал, что экспоненция неявно преобразована в float, но я уверен, что значения, которые я использую, являются типами float. Я думаю, это может быть связано с довольно небольшими числами. Тем не менее, это тот ответ, который я искал. – Maitane

2

В python оператор^является операцией XOR. Возведение осуществляется с помощью ** оператор, который будет давать ошибку ZeroDivision при 0 ** - 1

 Смежные вопросы

  • Нет связанных вопросов^_^