Десятичная точность в Python

Когда я запускаю код

b = 7**7

Я получаю б как 823543

Но когда я бегу

b= 823543.0**(1.0/7.0)

Это дает мне b как 6.999999999999999

Если это что-то простое, как 4 ** (1/2), возвращается 2.

Мой вопрос в том, почему Python просто не возвращает идеальную 7?

Также я делал это, чтобы проверить, можно ли записать число n можно записать в форме p ^ q, где p> 0 и q> 1, для этого я сделал следующее:

 def isPower(self, A):
    possible = 0 # Integer value to check  if it is possible , 0 assuming it is false initally
    if (A==1):
        return 1
    for i in xrange(2,A-1):
        res = float(A)**(1.0/float(i)) #Check if it has sqaure root or cube root up untill A-1
        if (res.is_integer()): #If taking the power gives me whole number then saying it is possible
            possible = 1
            break
    return possible

Эта логика не работает с более высокими числами, такими как 823543, потому что мощность возвращает неточное значение, как я могу это решить?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
110
3

Ответы 3

Почему не rounding:

>>> b= 823543**(1/7)
>>> round(b)
7
>>> 

Теперь у вас есть 7 (семь)

Да, проблема в том, что я проверяю, может ли число быть представлено в терминах p ^ q, если я округлю все, моя логика потерпит неудачу, потому что я проверяю, даст ли мне идеальное целочисленное значение, представленное как float. Округление всегда приводит к точному целому числу.

Sam Thomas 26.10.2018 07:49

@ SamThomas float(round(b)) для 7.0.

U12-Forward 26.10.2018 07:50

Да, это сработает, но когда я проверю, может ли 5 ​​быть представлено как p ^ q, 5 ^ (1/2) - десятичный ответ, и если я округлю его, моя программа предположит, что его можно представить как p ^ q, поэтому вот почему Я не могу это округлить.

Sam Thomas 26.10.2018 07:52

@SamThomas Хорошо, тогда не используйте мой :-)

U12-Forward 26.10.2018 09:26

Вы не используете десятичные дроби - вы используете числа с плавающей запятой. Они жертвуют точностью ради скорости.

Попробуй это;

from decimal import Decimal
b = 7 ** 7  # 823543
a = Decimal(1) / Decimal(7)
b ** a  # returns (for me) Decimal('7.000000000000000000000000004')

OP хочет, чтобы 7 был полным номером.

U12-Forward 26.10.2018 07:46

@ U9-Forward Верно. И это так близко, что вы сможете использовать stdlib python.

Shadow 26.10.2018 07:47

Это своего рода объясняет это тем, что существует верхний предел точности для float, а Decimal увеличивает его еще больше. Хотел бы я каким-то образом получить идеальную 7.

Sam Thomas 26.10.2018 07:50

Вы должны прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой.

Вкратце: числа с плавающей запятой представлены в виде мантиссы и экспоненты. Что-то вроде

0.1234 * 10^1

Где 1234 - мантисса (показатель степени представлен в 2-дополнении, если я правильно помню)

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

Вы можете представить 7 и 823543 в точности как числа с плавающей запятой, но я не думаю, что это работает для 1/7 (нет под рукой листка бумаги): https://www.h-schmidt.net/FloatConverter/IEEE754.html

Также примите во внимание, как вычисляется n-корень.

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