我很好奇,因为我们在2年前写的代码中发现了一个错误.我们用0x8000初始化了一个16位有符号整数(该平台当然使用2的补码表示为负数).在一个难以重现的特殊情况下,对该变量执行10的模数以提取十进制表示中的各个数字,同时该值仍为0x8000(-32768).-32768%10 == 248这对我们的应用程序毫无意义.
我们的平台是OKI 411微控制器.
我很好奇,虽然在这种情况下采用负数模数没有任何意义,是否有任何现实生活中的例子或实际理由或以某种方式通过取负数的模数获得利益?
我需要提供更完整的答案.
正如你所说,数学上有意义(尽管你不需要成为数学家才能理解这一点),但让我澄清一些事情.当我说你对残留感兴趣时,这是正确的,人们可能会错误地认为正(a mod n)或负(-a mod n)数字的残差是相同的,因为人们会天真地放弃符号并在负数中进行除法案件.当然,你现在知道这是不正确的.您可以通过这种方式来考虑它:在计算时a mod n,首先要找出哪个数字n*x(其中x是整数)最接近a而不经过a.在这之后,你算之间有多少数量是有n*x和a.一个例子可能在这里有所帮助:
假设你想要-282 mod 10,那么10*-29 = -290最接近-282而不会超过它.然后你只需算多少数字之间n*x和a(即290和282之间).有8个数字,这是你的答案,这是正确的.一方面,对于正数(282 mod 10),最接近282的数字将是10*28 = 280(记住,我们不想超过282).因此,中间有两个数字(也正确).
至于应用程序,我不确定一个应用程序特别依赖于计算负数的模数,但模块化算术的整个领域提供了很多应用程序.请参阅上面的Wikipedia链接,了解它们.如果不是因为具有负数的模运算的数学一致性,可能我们最终会得到较少的一般定理,这反过来意味着不那么强大的应用.
关于你的编程困境:
当a或n为负数时,这种天真的定义就会失效,编程语言在如何定义这些值方面会有所不同.尽管通常在a和n都是整数的情况下执行,但许多计算系统允许其他类型的数字操作数.
另请参见本.
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |