Возможно ли, чтобы одно и то же значение, умноженное на другое число (и его множественное число), упало на разные значения? - PullRequest
0 голосов
/ 14 января 2020

Возможно ли, что при заданном значении (например, 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 до раунда? Или математика с плавающей точкой гарантирует это мне из коробки?

1 Ответ

3 голосов
/ 14 января 2020

Ответ IEEE754

Спецификация IEEE754 требует, чтобы возвращалось самое близкое значение с плавающей запятой к операции арифмети c.

Итак, 1.0f / 8 будет таким же, как 2.0f / 16, например.

Но это не означает, что a * b / c обязательно совпадает с a * (n * b) / (n * c) для произвольного n. Это связано с тем, что ассоциативность из * и / слева направо.

Конечно, я предполагаю, что числитель и знаменатель могут быть представлены точно, что маленькие целые числа могут быть.

Общий ответ

В общем случае, C ++ с плавающей запятой не гарантирует это.

...