В каком сегменте находится данное число? [Дубликат]
На этот вопрос уже есть ответ:
Математика с плавающей точкой нарушена? 28 ответов Предположим, что естьn
(целое число) непрерывных отрезков длиныl
(плавающая точка). То есть
Segment 0 = [0, l)
Segment 1 = [l, 2*l)
Segment 2 = [2*l, 3*l)
...
Segment (n-1) = [(n-1)*l, n*l)
Дай номерx
(с плавающей точкой) Я хочу определить идентификатор сегмента, внутри которого он находится.
Моя первая идея заключается в следующем:
int segmentId = (int) floor(x/l);
Во всяком случае, это иногда не работает. Например, рассмотрим
double l = 1.1;
double x = 5.5;
int segmentId = (int) floor(x/l); //returns 5
double l = 1.1;
double x = 6.6;
int segmentId = (int) floor(x/l); //returns 5!!!
Конечно, из-за конечной арифметики это не очень хорошо работает. Возможно, для надежной реализации требуются дополнительные проверки, но я действительно не знаю, как действовать дальше.
Вопрос в том как бы ты решил проблему "в каком сегменте находится данное число?"