Как решить ошибку с плавающей запятой при сравнении двух чисел

#python

#python

Вопрос:

 import math
from fractions import Fraction
Lis = [
       1, 2 , 3 , 6 , 1/2 , 1/3 , 1/4 , 1/6 , 1/12 , 2/3, 3/2, 3/4, 
       -1,-2,-3,-6, -1/2 , -1/3 , -1/4 , -1/6 , -1/12 , -2/3, -3/2, -3/4  
      ]
for x in lis:
    if abs((12(x^3) - 32 (x^2)   25 (x) - 6 ) - 0) == 1*max (abs(12 (x)^3 - 32 (x^2)   25 (x) - 6), abs (0)) == True :
        print(x, end = ', ')
  

Я пытался решить полиномиальную функцию с помощью python, но столкнулся с благословением; в результате я составляю список возможных нулей функции, поэтому следующим из этого списка, используя цикл for, я попытался ввести эти числа в уравнение, но я нахожу только два ответа 1/2,и 3/2 по нулям было пропущено 3/2 из-за его десятичного повторения 0,6666667; в результате это число дает не ноль, а 2/3, поэтому мой вопрос: есть ли какой-либо способ избавиться от этой проблемы и получить результат
1/2, 2/3 и 3/2?

Комментарии:

1. @Jordan — в вашем коде есть ошибки: 1) ^ является побитовым оператором xor, ** является возведением в степень, 2) Вы определяете Lis , но ваш цикл for имеет for x in lis . 3) Вам нужно * умножить значение между константами и переменной, т.е. 12*(x**3) вместо 12 (x) ^ 3. Кроме того, это не ошибка, но в чем смысл abs(0) по сравнению с простым использованием 0 (вводит путаницу)?

Ответ №1:

вы можете использовать math package и with isclose вместо == you can solve . проблема, если вы используете python 3.5=< версия

 import math

math.isclose(1.656, 1655, abs_tol=0.001) 
  

результат

 True
  

если ваша версия 3.5>, вы можете определить ее следующим образом:

 def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
    return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
  

итак, ваш целевой код будет таким, как показано ниже:

 import math
from fractions import Fraction
Lis = [
       1, 2 , 3 , 6 , 1/2 , 1/3 , 1/4 , 1/6 , 1/12 , 2/3, 3/2, 3/4,
       -1,-2,-3,-6, -1/2 , -1/3 , -1/4 , -1/6 , -1/12 , -2/3, -3/2, -3/4
      ]
for x in Lis:
    first_value = abs((12. * (x ^ 3) - 32. * (x ^ 2)   25. * (x) - 6.) - 0)
    sec_value = 1 * max(abs(12. * (x ^ 3) - 32. * (x ^ 2)   25. * x - 6.), abs(0))
    if math.isclose(first_value, sec_value, abs_tol=0.001):
        print(x, end=', ')

  

Комментарии:

1. Подробнее об isclose этом можно найти здесь: python.org/dev/peps/pep-0485

2. @MaryamAbdoli — этот код выдает ошибку TypeError: unsupported operand type(s) for ^: 'float' and 'int'

Ответ №2:

Проблемы с операционным кодом

  1. Вы импортируете модуль дроби, но не используете его
  2. ^ — побитовый оператор xor, ** — возведение в степень,
  3. Вы определяете Lis, но ваш цикл for имеет for x в lis.
  4. Вам нужно * между константами и переменной для умножения, т.е. 12 * (x ** 3), а не 12 (x) ^ 3.

Код

 import math
from fractions import Fraction
# Use Fraction for fractional numbers
Lis = [
       1, 2 , 3 , 6 , Fraction('1/2'), Fraction('1/3'), Fraction('1/4'), Fraction('1/6'), 
        Fraction('1/12'), Fraction('2/3'), Fraction('3/2'), Fraction('3/4'), 
       -1, -2, -3, -6, Fraction('-1/2'), Fraction('-1/3'), Fraction('-1/4'), 
        Fraction('-1/6'), Fraction('-1/12'), Fraction('-2/3'), Fraction('-3/2'), Fraction('-3/4') 
      ]
for x in Lis:
    value = 12*(x**3) - 32*(x**2)   25*x - 6
    if value == 0:            # Now we can compare value to absolute 0 (since we use Fraction)
        print(x, end=', ')
  

Вывод (выводит дроби)

 1/2, 2/3, 3/2,