Когда я запускаю код
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, потому что мощность возвращает неточное значение, как я могу это решить?
Почему не round
ing:
>>> b= 823543**(1/7)
>>> round(b)
7
>>>
Теперь у вас есть 7
(семь)
@ SamThomas float(round(b))
для 7.0
.
Да, это сработает, но когда я проверю, может ли 5 быть представлено как p ^ q, 5 ^ (1/2) - десятичный ответ, и если я округлю его, моя программа предположит, что его можно представить как p ^ q, поэтому вот почему Я не могу это округлить.
@SamThomas Хорошо, тогда не используйте мой :-)
Вы не используете десятичные дроби - вы используете числа с плавающей запятой. Они жертвуют точностью ради скорости.
Попробуй это;
from decimal import Decimal
b = 7 ** 7 # 823543
a = Decimal(1) / Decimal(7)
b ** a # returns (for me) Decimal('7.000000000000000000000000004')
OP хочет, чтобы 7
был полным номером.
@ U9-Forward Верно. И это так близко, что вы сможете использовать stdlib python.
Это своего рода объясняет это тем, что существует верхний предел точности для float, а Decimal увеличивает его еще больше. Хотел бы я каким-то образом получить идеальную 7.
Вы должны прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой.
Вкратце: числа с плавающей запятой представлены в виде мантиссы и экспоненты. Что-то вроде
0.1234 * 10^1
Где 1234 - мантисса (показатель степени представлен в 2-дополнении, если я правильно помню)
Это означает, что некоторые целые числа не могут быть точно представлены как числа с плавающей запятой.
Вы можете представить 7 и 823543 в точности как числа с плавающей запятой, но я не думаю, что это работает для 1/7 (нет под рукой листка бумаги): https://www.h-schmidt.net/FloatConverter/IEEE754.html
Также примите во внимание, как вычисляется n-корень.
Да, проблема в том, что я проверяю, может ли число быть представлено в терминах p ^ q, если я округлю все, моя логика потерпит неудачу, потому что я проверяю, даст ли мне идеальное целочисленное значение, представленное как float. Округление всегда приводит к точному целому числу.