Мы должны сравнить числа с плавающей точкой для равенства против *родственник* ошибка?

Если интерпретация, которую я дал в своем комментарии, верна, один из способов разрешить пользователю вызывать функции, которые вы определяете, - поместить эти функции в словарь с указанием их имени. Затем вы можете проверить этот дикт, чтобы увидеть, принадлежит ли ему 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
}
15
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Все это зависит от определенной проблемной области. Да, использование относительной погрешности будет более корректным в общем случае, но это может быть значительно менее эффективно, так как это вовлекает дополнительное подразделение с плавающей точкой. Если Вы знаете, что приблизительный масштаб чисел в Вашей проблеме, с помощью абсолютной погрешности приемлем.

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

19
ответ дан 1 December 2019 в 02:56
поделиться

Как альтернативное решение, почему не только вокруг или усеченный числа и затем делают прямое сравнение? Путем определения номера значащих цифр заранее, можно быть уверены в точности в связанном.

5
ответ дан 1 December 2019 в 02:56
поделиться

Проблема состоит в том, что с очень большими числами, по сравнению с эпсилоном перестанет работать.

Возможно, лучшее (но медленнее) решение должно было бы использовать подразделение, пример:

div(max(a, b), min(a, b)) < eps + 1

Теперь 'ошибка' будет относительна.

1
ответ дан 1 December 2019 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: