繁体   English   中英

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

[英]Math.IEEERemainder returns negative results. Why?

除了标准的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

如果您阅读System.Math.IEEERemainder的MSDN页面中给出的示例,您会注意到两个正数可以具有负余数。

回报价值

一个等于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#余数运算符产生的舍入的细微差异不是特别敏感,那么继续使用运算符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM