2016-08-03 6 views
3

Чтение ответ @anton в этом link я попытался увидеть, если на самом деле 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

От wikipedia:

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

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

+0

Круглый -> этаж. – deniss

+2

Формула предполагает, что x и y являются плавающей точкой, а не целыми числами. –

+0

@RaymondChen -_- если бы они были целыми числами, я получу правильный ответ! Без комментариев ! – rondino

ответ

2

Существует небольшая разница в том, что делает remainder. От man page:

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

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

+0

, поэтому я должен использовать функцию 'nearint()' вместо этого? – rondino

+0

Хороший ответ (+1). Возможно, вы захотите добавить ссылку/ссылку на [округление банкира] (http://c2.com/cgi/wiki?BankersRounding), чтобы OP мог узнать больше о разных алгоритмах округления и их границах ошибок. :) – DevNull

+0

Я проверю ваш ответ, если вы предоставите ссылку для этого! – rondino