Как проверить, является ли число целым числом с хорошей точностью?
Есть похожий вопрос: проверка, является ли переменная целым числом или нет, но я не вижу ответа на свой вопрос.
Я имею в виду, я недавно боролся с большими числами, поэтому мой друг предложил мне установить Python. Я открыл его сегодня, чтобы я мог вычислять большие числа и иметь хорошую точность, но... как использовать эту точность? Я имею в виду, если я сделаю что-то вроде pow(31,123)
это работает нормально, но если я хочу проверить, является ли число целым, я получаю:
>>> (4.00000000000001).is_integer()
False
>>> (4.000000000000001).is_integer()
False
>>> (4.0000000000000001).is_integer()
True
>>> (4.00000000000000001).is_integer()
True
Я хотел написать простой цикл, чтобы найти некоторые решения диофантового уравнения, где мне нужно взять квадратный корень из очень большого числа и проверить, является ли оно целым числом, но теперь я в крайнем случае. Может ли кто-нибудь мне помочь или дать совет, как добиться большей точности?
Пример:
Например: $ 2x^2 = 1 + y^31 $, где x,y - целые числа. Моя идея состоит в том, чтобы сделать цикл, где я увеличиваю y (начиная с 1), добавляю 1, делю на 2, беру квадратный корень, и тогда оно должно быть целым числом, чтобы удовлетворить уравнению. Вот почему мне это нужно.
3 ответа
Вы можете проверить, является ли данное число квадратом целого числа, используя код ниже:
def is_square(x):
s = int(sqrt(x) + 0.5)
return s * s == x
Подобный подход может быть использован для диофантового уравнения. Просто конвертируйте y, найденный для данного x, в int (y = int(y + 0.5)), а затем проверьте, верно ли диофантово уравнение для найденных данных x и y.
4.0000000000000001
не может быть точно представлен как float:
>>> format(4.0000000000000001, '.53f')
'4.00000000000000000000000000000000000000000000000000000'
так что это число действительно целое число. Вы не можете надеяться выйти за пределы 15 десятичных цифр в большинстве систем:
>>> sys.float_info.dig
15
Увидеть sys.float_info
структура, dig
атрибут представляет:
максимальное количество десятичных цифр, которое может быть достоверно представлено в формате с плавающей точкой
Использовать decimal
модуль вместо, если вам нужно больше точности.
Разве вы не можете использовать встроенную функцию "тип"? Я запустил следующее:
print type(4.0000000000000000000000000000000000000000000000001)
print type(4)
и получил результат:
<type 'float'>
<type 'int'>
Затем вы можете проверить вхождение 'int' и 'float' в результат, используя метод find()