остаток(x,y) действительно x-((round(x/y)*y)?

Читая ответ @anton в этом ссылка Я попытался проверить, действительно ли remainder(x, y) соответствует x-(round(x/y)*y).

Запуск кода для значений x=5. и y=2.. Я получил:

printf("the value of remainder is %f\n",remainder(x, y));
printf("the value of remainder is %f\n",x-(round(x/y)*y));

стоимость остатка 1.000000

значение остатка -1.000000

Из википедии:

остаток с плавающей запятой. Это не похоже на обычную операцию по модулю, она может быть отрицательной для двух положительных чисел. Он возвращает точное значение x–(round(x/y)·y).

Объяснение Антона неправильное, или я что-то упускаю?


person rondino    schedule 03.08.2016    source источник
comment
Формула предполагает, что x и y являются числами с плавающей запятой, а не целыми числами.   -  person Raymond Chen    schedule 03.08.2016
comment
@RaymondChen -_- если бы они были целыми числами, я бы получил правильный ответ! Без комментариев !   -  person rondino    schedule 03.08.2016
comment
IEEE использует банковское округление. Они думают, что round(2.5) должен быть равен 2, а не 3.   -  person Hans Passant    schedule 03.08.2016
comment
@HansPassant - это nearbyint() функция, использующая округление банкира?   -  person rondino    schedule 03.08.2016
comment
Он использует режим округления, установленный функцией std::fesetround(). Никаких банкиров в комитете по стандартизации C++.   -  person Hans Passant    schedule 03.08.2016
comment
Извините, что означает round() в контексте Википедии? Вы можете отредактировать свой вопрос и добавить определение функции round()?   -  person Luis Colorado    schedule 05.08.2016
comment
проверьте комментарий Ганса Пассана, который выше. Это округление банкира   -  person rondino    schedule 07.08.2016


Ответы (1)


Есть небольшая разница в том, что делает remainder. На справочной странице:

Функция rester() вычисляет остаток от деления x на y. Возвращаемое значение — x-n*y, где n — значение x/y, округленное до ближайшего целого числа. Если абсолютное значение x-n*y равно 0,5, n выбирается четным.

Таким образом, в промежуточном случае часть округления, выполняемая remainder, округляется не от нуля, а до ближайшего четного числа.

person dbush    schedule 03.08.2016
comment
поэтому я должен вместо этого использовать функцию nearbyint()? - person rondino; 03.08.2016
comment
Хороший ответ (+1). Возможно, вы захотите добавить ссылку/ссылку на округление банкира, чтобы OP мог узнать больше о различных округлениях. алгоритмы и границы их ошибок. :) - person Cloud; 03.08.2016
comment
Я проверю ваш ответ, если вы предоставите ссылку для этого! - person rondino; 03.08.2016
comment
@rondino Добавил ссылку. Также изменен тест в кавычках, поскольку формулировка отличается от моей локальной справочной страницы (хотя смысл тот же). - person dbush; 03.08.2016