除了标准的取模运算符,.net框架还包括Math.IEEERemainder(x,y)函数。这个函数到底是在做什么?我不理解它产生的负数。
例子:
Math.IEEERemainder(0, 2) = 0
Math.IEEERemainder(1, 2) = 1
Math.IEEERemainder(2, 2) = 0
Math.IEEERemainder(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#余数运算符产生的微妙舍入差异,那么继续使用这个运算符即可。
IEEERemainder
操作或%
操作没有影响,因为两者都是精确的。精确意味着结果不受舍入模式的影响。它们之间的区别在于整数商的基本概念。IEEERemainder
将数学商四舍五入到最近的整数以得到x - q * y
中的q
。 - Pascal Cuoq