Если интерпретация, которую я дал в своем комментарии, верна, один из способов разрешить пользователю вызывать функции, которые вы определяете, - поместить эти функции в словарь с указанием их имени. Затем вы можете проверить этот дикт, чтобы увидеть, принадлежит ли ему i
, и вызвать функцию, если это необходимо.
def buclick():
i = ent.get()
if i in user_callable_functions:
user_callable_functions[i]()
else:
messagebox.showinfo("Error", "There is no product with this name")
#put this just above root.mainloop()
user_callable_functions = {
"ic5501": ic5501,
"ic5502": ic5502
}
Все это зависит от определенной проблемной области. Да, использование относительной погрешности будет более корректным в общем случае, но это может быть значительно менее эффективно, так как это вовлекает дополнительное подразделение с плавающей точкой. Если Вы знаете, что приблизительный масштаб чисел в Вашей проблеме, с помощью абсолютной погрешности приемлем.
Эта страница обрисовывает в общих чертах много методов для сравнения плаваний. Это также пробегается через многие важные проблемы, такие как те, которые имеют поднормаль, бесконечности и NaNs. Это - большое чтение, я настоятельно рекомендую чтение всего этого путь через.
Как альтернативное решение, почему не только вокруг или усеченный числа и затем делают прямое сравнение? Путем определения номера значащих цифр заранее, можно быть уверены в точности в связанном.
Проблема состоит в том, что с очень большими числами, по сравнению с эпсилоном перестанет работать.
Возможно, лучшее (но медленнее) решение должно было бы использовать подразделение, пример:
div(max(a, b), min(a, b)) < eps + 1
Теперь 'ошибка' будет относительна.