Как проверить, является ли число целым числом с хорошей точностью?

Есть похожий вопрос: проверка, является ли переменная целым числом или нет, но я не вижу ответа на свой вопрос.

Я имею в виду, я недавно боролся с большими числами, поэтому мой друг предложил мне установить 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()

Другие вопросы по тегам