为啥模运算符的行为与数学派系 MOD 不同

Posted

技术标签:

【中文标题】为啥模运算符的行为与数学派系 MOD 不同【英文标题】:Why does the modulo operator behave differently from mathematical faction MOD为什么模运算符的行为与数学派系 MOD 不同 【发布时间】:2016-08-31 11:36:03 【问题描述】:

通常的方法和编程方法在负数除以负数方面存在异常,如下图所示。

异常的数学演示:(对不起,笔迹不好:)希望它是可读的)

C# 对两个负数进行除法的方法:

当我用通常的语法将两个负数相除时,如何强制 C# 遵循分数概念?请不要建议我使用以下算法:

// 'num1' and 'num2' are the two numbers of 'int' data-type to be divided where Math.Abs(num1) > Math.Abs(num2)
if (num1<0 && num2<0)  // both numbers are negative
    Console.WriteLine(Math.Abs(num1)%Math.Abs(num2)); 
else 
    Console.WriteLine(num1%num2);

PS:请注意,在数学异常中不需要详细说明两个负数相除产生的两个答案。只是建议我一种强制 C# 遵循上述分数概念的方法(如果可能的话)。

PPS:解释为什么编程语言遵循正常的除法而不是分数概念也会有帮助:)

编辑:上面的 C# 方法图片的代码(适用于那些觉得图像难以阅读的人:))

// Tests to see C#'s return values for signed and unsigned "modular division"
Console.WriteLine("-10 MOD 3 = "+ ((-10)%(3))); // Displays -1 (as expected)
Console.WriteLine("10 MOD -3 = "+ ((10)%(-3))); // Displays 1 (as expected)
Console.WriteLine("10 MOD 3 = "+ ((10)%(3))); // Displays 1 (as expected)
Console.WriteLine("-10 MOD -3 = "+ ((-10)%(-3))); // Displays -1 (should have displayed a positive 1)

Console.WriteLine("-10 MOD -3 (with no brackets placed for numbers) = "+ (-10%-3)); // Same output as that of above statement i.e. -1

更新:考虑到 Stack Overflow 社区的意见,我相信任何编程语言都不能强制遵循“分数概念”。但是欢迎社区中的任何人就“为什么编程语言使用'除法'?”发表意见。问题。如果有人在不久的将来找到在 C# 中强制执行“分数概念”的方法,也请发布解决方案。谢谢。 :)

【问题讨论】:

能否将相关代码复制到问题中?图像很难阅读 - 特别是对于来自搜索引擎的未来读者。 为什么,不知道,可能是因为在 cpu 中移动位更容易。这可能会帮助你。 codeproject.com/Articles/9078/Fraction-class-in-C @HimBromBeere 我会这样做的。 “分数概念” == 浮点数学。这要求至少有一个操作数是floatdouble。如果它们是整数类型,那么你得到整数除法,没有分数。所以 1 / 2 = 0 和 1.0 / 2 = 0.5。您可以通过强制转换其中一个操作数 (double)1 / 2 = 0.5 来强制进行浮点除法 我看不懂手写图片,抱歉。 【参考方案1】:
(-10) % (-3) = ( (-9)          + (-1) ) % (-3) 
             = ( 3*(-3)        + (-1) ) % (-3) 
             = (3*(-3)) % (-3) + (-1) % (-3) 
             = 0 + (-1) % (-3)

所以-10 mod -3 = -1 mod -3

请与the spec of C#'s % operator比较...

请注意,作为数学家,我不会用 b 做 mod b

【讨论】:

这是否意味着数学逻辑需要对类似的操作进行补偿?我的意思是没有办法绕过它吗?感谢您的关注。 这里的问题是,上面的mod的预期结果与使用“分数概念”的预期结果不同。根据不同的观点,两者都可能是正确的,因此不清楚正确的结果是什么。所以 - 在我看来 - 你应该简单地省略 mod (a) 的概念 for a 感谢您的意见。我会这样做的。 :)

以上是关于为啥模运算符的行为与数学派系 MOD 不同的主要内容,如果未能解决你的问题,请参考以下文章

数学与编程——求余取模运算及其性质

Python笔记-取模运算%

加解密学习之--模运算与经典密码学

为啥虚拟分配的行为与相同签名的其他虚拟功能不同?

数学 中mod是啥意思

我可以依靠 C 中的 % (模)运算符来处理负数吗?