Если вы читали пример, приведенный на странице MSDN System.Math.IEEERemainder, вы заметите, что два положительных числа могут иметь отрицательный остаток.
Возвращаемое значение
Число, равное x - (y Q), где Q - частное от x / y, округленное до ближайшего целого числа (если x / y находится на полпути между двумя целыми числами, возвращается четное целое число).
Итак: 3 - (2 * (round (3/2))) = -1
/*
...
Divide two double-precision floating-point values:
1) The IEEE remainder of 1.797693e+308/2.00 is 0.000000e+000
2) The IEEE remainder of 1.797693e+308/3.00 is -1.000000e+000
Note that two positive numbers can yield a negative remainder.
*/
Эпилог
Фактический вопрос может заключаться в том, почему у нас есть две операции с остатком? Имея дело с данными с плавающей запятой, вы всегда должны быть осведомлены о своем стандарте с плавающей запятой. Поскольку мы живем в 21 веке, почти все работает на IEEE 754, и очень немногие из нас беспокоятся, скажем, о VAX F_Float по сравнению с IEEE 754.
В стандарте C # говорится, что оператор остатка (раздел 7.7. 3) в применении к аргументам с плавающей запятой аналогичен оператору остатка в применении к целочисленным аргументам. То есть одна и та же математическая формула 1 используется (с дополнительными соображениями для угловых случаев, связанных с представлениями с плавающей запятой) как в операциях с целыми числами, так и в операциях с остатками с плавающей запятой.
Поэтому, если вы хотите, чтобы ваши операции с остатком для чисел с плавающей запятой соответствовали вашим текущим режимам округления IEEE 754, рекомендуется использовать Math.IEEERemainder. Однако, если ваше использование не особенно чувствительно к тонкой разнице в округлении, производимой оператором остатка C #, продолжайте использовать оператор.
- Дано: z = x% y, тогда z = x - (x / y) * y
person
user7116
schedule
01.10.2008