Math.IEEERemainder返回负面结果。为什么?

时间:2008-10-01 15:10:55

标签: .net .net-2.0

除了标准的mod运算符之外,.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

1 个答案:

答案 0 :(得分:8)

如果您阅读System.Math.IEEERemainder's MSDN page中给出的示例,您会注意到两个正数可能会有负余数。

  

返回值

     

等于 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# standard表示当应用于浮点参数时,余数运算符(第7.7.3节)在应用于整数参数时类似于余数运算符。也就是说,在整数和浮点余数运算中,使用相同的数学公式 1 (对浮点表示的相关角点情况进行额外考虑)。

因此,如果您希望浮点数上的余数运算符合当前的IEEE 754舍入模式,建议使用 Math.IEEERemainder 。但是,如果您的使用对C#余数运算符产生的舍入的细微差异不是特别敏感,那么继续使用运算符。

  1. 给定:z = x%y,则z = x - (x / y)* y