Возможно ли, что при заданном значении (например, 44100.0f) и умножении на другое (или его кратное число) (т. Е. 1/8 = 2/16) это даст другое значение?
Пример:
44100.0 * 1/8 != 44100.0 * 2/16
или
44100.0 * 1/8 != 44100 * 2 / 16
Это потому, что я делаю что-то вроде этого:
float patternLength = 44100.0f;
float steps = 8.0f;
float position = 1.0f;
float stepLength = patternLength / steps;
int result = (int)std::round(position * stepLength);
Это дает 5513
(поскольку округляет 5512.5
до 5513
), но что если результат будет 5512,4999999
? Оно округляется до 5512
.
Это моя проблема: мне нужно убедиться, что они принимают одинаковые значения, независимо от того, какие умноженные числа (и их кратные).
Нужно ли мне суммировать что-то вроде EPSILON
до раунда? Или математика с плавающей точкой гарантирует это мне из коробки?