Как получить значение, обратное значению float в python

#python #math #pygame

#python #математика #pygame

Вопрос:

У меня возникли некоторые проблемы в моем приложении pygame, которое я создаю. В меню есть кнопки, которые изменяют скорость выполнения моей симуляции (путем изменения speed в clock.tick(speed*10) ). Это, однако, также замедляет скорость реагирования кнопок меню. Если я установлю в игре значение speed в любом месте ниже 0,5, кнопкам speed и play / pause потребуется до пяти секунд, чтобы зарегистрировать щелчок. Итак, я попытался создать свой собственный способ обойти это:

 speed = 1 # defined previously ingame

timeSlow = 0
timeSlowGoal = 0

while True: # game loop

    if speed < 1:

        timeSlowGoal = reciprocal(speed) # well here's my problem

    else:
        timeSlowGoal = -1

    if timeSlowGoal != -1:

        if timeSlow >= timeSlowGoal:
            timeSlow = 0
            # more code that actually does stuff

        else:
            timeSlow  = 1
            # doesn't match, try again
  

В Python для изменения переменной есть такие приемы, как int() , string() и float() . Конечно, reciprocal() не работает. Существует ли какая-нибудь функция, подобная этой, которая получает значение, обратное числу (которое в данном случае всегда является десятичным), или мне нужно просто выполнить некоторую причудливую математику, чтобы получить это?

(конечно, если все это не нужно и у вас есть лучшее решение моей первой проблемы, дайте мне знать)


РЕДАКТИРОВАТЬ: Хорошо, есть очень простое решение для этого, которое я упустил из виду. 1 / n всегда равно n. Нет необходимости в функции reciprocal(), потому что это так просто. Это то, что я получаю за то, что забываю математику в начальной школе.

Комментарии:

1. Под обратной величиной вы подразумеваете 1 / n?

2. @jatinderjit Да, это значение, обратное n, если n — целое число. Это просто. Что мне нужно, так это способ получить 2 из 1/2, 4 из 1/4 и т.д.

3. Нет, 1 / n всегда является обратной величиной (независимо от того, является ли n целым числом или даже иррациональным). 1 / (1/2) равно 2.

4. Используйте timeSlowGoal = 1.0/speed , чтобы получить значение, обратное, поскольку, как мы все учили в начальной математике в школе, 1 / (1 / x) = x . Что касается зависания кнопок, вы не предоставляете достаточно информации, чтобы иметь возможность найти решение.

5. Что ж, похоже, я забыл об этом. Спасибо jatinderjit за напоминание.

Ответ №1:

Предполагая, что вы используете Python 3, измените

timeSlowGoal = reciprocal(speed)

Для

timeSlowGoal = 1 / speed

Просто убедитесь, что вы не пытаетесь сделать это, если скорость равна нулю.

Ответ №2:

Я не знаю, почему у вас такой огромный кусок кода, потому что обратное значение числа можно просто упомянуть как: 1/n

Итак, ваша reciprocal функция может быть просто записана как:

 def reciprocal(n):
    return 1.0 / n
  

Здесь я использую 1.0/n вместо 1/n того, чтобы в python результирующей от деления была дробь, либо в числителе, либо в знаменателе должно быть значение дроби.

Пример запуска:

 >>> reciprocal(3)
0.3333333333333333
>>> reciprocal(0.3333333)
3.00000030000003   # Not '3' because of the loss in the precision of value entered
>>> reciprocal(reciprocal(3))
3.0   # Doing reciprocal twice returns "3"
  

Комментарии:

1. Я предполагаю, что второй ответ не возвращает 3, потому что ваш ввод не повторяет 3 вечно (или, по крайней мере, до тех пор, пока python не перестанет заботиться). Спасибо за ваш ответ.

2. @NoRt9001: Когда вы записываете дроби типа 1/3 , 1/6 как десятичные, всегда происходит некоторая потеря точности. Когда вы инвертируете их снова, разница в исходном значении возникает из-за потери точности на предыдущем шаге

3. Я бы использовал это и также включил round() функцию, на случай, если точность может быть фактором позже с переменной.

4. @maze88: Если подумать, это нехорошо, поскольку вы будете играть с точностью до фактического значения. Потому что результат отличается, потому что мы предоставили менее точное значение. reciprocal(reciprocal(3)) ВОЗВРАТ "3.0"