2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
|
||||||
1 | ||||||
Сравнение чисел с плавающей точкой05.09.2014, 13:08. Показов 11588. Ответов 33
Метки нет (Все метки)
Известно, что числа с плавающей точкой нельзя сравнивать с помощью ==. Однако, нет ли исключения из этого правила? Дело вот в чём. Если мы вводим значение такой переменной (которое заведомо не будет за пределами точности), а потом сравниваем с некоторыми такими же "чистыми" значениями с помощью ==, это будет адекватно? Можно ли так делать, и если нельзя, то почему?
Пример:
1
|
05.09.2014, 13:08 | |
Ответы с готовыми решениями:
33
Написать защиту от ввода чисел с плавающей точкой, отрицательных чисел и символов Умножения чисел с плавающей точкой Массив чисел с плавающей точкой Представление чисел с плавающей точкой |
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
|
|
05.09.2014, 16:35 [ТС] | 22 |
Добавлено через 9 минут Окда, изучаю 4-й пункт, хотя пришлось ради этого тащиться в кэш гугла - хабр лежит. Таки получается, нельзя ?
0
|
И целого heap'а мало
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
|
|||||||||||
05.09.2014, 17:53 | 24 | ||||||||||
Всё верно, нельзя числа с плавающей точкой тупым == (без перегрузок) сравнивать как инты.
В сяшном стиле это делается через FLT_EPSILON, DBL_EPSILON или LDBL_EPSILON из float.h:
1
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
05.09.2014, 18:03 | 25 |
А введенное с клавиатуры оно ведь не в клавиатуре сохраняется. Оно, при записи в память, интерпретируется как с плавающей точкой со всеми выплывающими.
1
|
05.09.2014, 22:09 | 27 |
Только из этого имхо ничего не выплывает. Приведение типов что прочитанные символы с клавиатуры в IEEE переведет, что написанные в тексте кода. И если алгоритм переведения будет одинаков (а с чего ему быть разным?), то и результат будет одинаков в мантиссе вплоть до бита.
Но я бы ТС очень не рекомендовал строить логику программы, опираясь на эти предположения.
0
|
18827 / 9830 / 2403
Регистрация: 30.01.2014
Сообщений: 17,266
|
|
05.09.2014, 22:29 | 28 |
Некоторые числа не могут быть представлены точно в формате с плавающей точкой (IEEE 754). Например, число 0.005, или 0.1. Т.е. да, это точные числа, но в 10-й системе счисления, в 2й системе счисления (IEEE 754 описывает числа именно в системе по основанию 2) эти числа не имеют точного представления. Отсюда все эти погрешности. Вот неплохой материал по теме.
1
|
И целого heap'а мало
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
|
|
05.09.2014, 22:33 | 29 |
Кстати, ещё в IEEE 754 операции над вещественными не ассоциативны (для битоперекладчиков-параноиков).
0
|
18827 / 9830 / 2403
Регистрация: 30.01.2014
Сообщений: 17,266
|
||||||
05.09.2014, 22:39 | 30 | |||||
_Ivana, вот к примеру, запусти такую программу:
0
|
05.09.2014, 22:48 | 31 |
Да я не про вычисления, это все понятно. Я про единообразность перевода во флоаты, на что хочет опереться автор.
Не по теме: ЗЫ битоперекладчики-параноики заспорили в соседнем разделе по С, высказались бы там что-ли :)
0
|
18827 / 9830 / 2403
Регистрация: 30.01.2014
Сообщений: 17,266
|
|
05.09.2014, 23:01 | 32 |
А, ага. Я значит как-то подругому тебя интерпретировал.
В принципе да, здесь не может быть строгой гарантии. Это implementation defined.
0
|
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
|
||||||
11.03.2017, 00:22 | 33 | |||||
я так сравнивал:
0
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
11.03.2017, 09:18 | 34 |
ИМХО, самый простой ответ на изначальный вопрос топикстартера (из практики):
1. целые значения плавающих типов можешь сравнивать как угодно. 2. Дробные значения можешь сравнивать на равенство-неравенство - только степени двойки (1/2, 1/4...) 3. Дробные значения - не степени двойки на равенство лучше не сравнивать, если значение получено в результате вычислений. Ты, конечно, можешь написать сравнение "==", но это как раз тот наиболее часто встречающийся случай, когда НЕ РЕКОМЕНДУЕТСЯ. Ибо все дробные числа - не степени двойки, представлены в памяти НЕ ТОЧНО.
0
|
11.03.2017, 09:18 | |
11.03.2017, 09:18 | |
Помогаю со студенческими работами здесь
34
Форматирование чисел с плавающей точкой Калькулятор чисел с плавающей точкой Проблема сравнения чисел с плавающей точкой Округление положительных чисел с плавающей точкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |