Десятичная точность в 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, потому что мощность возвращает неточное значение, как я могу это решить?

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-корень.

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