为啥模运算符的行为与数学派系 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 我会这样做的。 “分数概念” == 浮点数学。这要求至少有一个操作数是float
或double
。如果它们是整数类型,那么你得到整数除法,没有分数。所以 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 不同的主要内容,如果未能解决你的问题,请参考以下文章