每个人都听过这个joke by Bill Gosper:
任何给定的编程语言与机器无关的神话是 通过计算2的幂的总和容易爆炸。
- 如果结果使用符号+循环周期= 1,则表示您处于符号级别的计算机上。
- 如果结果以-1 = -1循环,则表示您使用的是二进制补码机。
- 如果结果以句点>循环1,包括开头,你是一台补充机器。
- 如果结果以句点>循环1,不包括开头,你的机器不是二进制 - 模式应该告诉你基础。
- 如果内存不足,则使用字符串或Bignum系统。
- 如果算术溢出是一个致命的错误,一些只读头脑的法西斯猪试图强制机器独立。但非常 陷阱溢出的能力取决于机器。
通过这种策略,考虑宇宙,或者更确切地说,代数:
让X =两个幂的总和= ... 111111
现在将X添加到自身;
X + X = ... 111110
因此,2X = X-1,因此X = -1因此代数在机器上运行(宇宙) 这是两个补充。
我想我理解其他部分,但我坚持一个人的补充部分。我将考虑一个3位加一个符号位的简单示例。
bignum和非二元架构的行为很明确。
如果结果使用符号+循环使用句点= 1,则表示您使用sign-magnitude计算机。
当两个幂溢出到符号位时,它变为负零,因此添加它不会改变任何东西。下一次迭代,它完全失败了,我们一遍又一遍地添加正零,保持在MAXINT
。
示例:
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -0 ||0|111|| +7 |
|0|000|| +0 ||0|111|| +7 |
|0|000|| +0 ||0|111|| +7 |
...
这确实是一个周期为1且为正值的循环。
如果结果以-1 = 1循环,则表示您使用twos-complement机器。
当2的幂溢出到符号位时,它产生最低的可表示整数。将其添加到
示例:
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -8 ||1|111|| -1 |
|0|000|| +0 ||1|111|| -1 |
|0|000|| +0 ||1|111|| -1 |
...
果然,它在-1处循环。
那是,我无法弄明白。我希望它应该去:如果结果以句点>循环1,包括开头,你在ones-complement机器上。
______________________________
| Power of 2 || Accumulator |
| | ||Decimal|| | ||Decimal|
|0|001|| +1 ||0|001|| +1 |
|0|010|| +2 ||0|011|| +3 |
|0|100|| +4 ||0|111|| +7 |
|1|000|| -7 ||1|111|| -0 |
|0|000|| +0 ||1|111|| -0 |
|0|000|| +0 ||1|111|| -0 |
...
我特别看不到它如何以大于1的周期循环。这意味着2的幂不是简单地通过左移(否则单个1位最终下降)产生的,但那么它们是怎样的呢?计算
答案 0 :(得分:2)
实现产生这两种权力的能力。也取决于机器。你假设左移。对于最后两台机器,另一种方式不同,即将当前机器添加到自身。
补充8 + 8 = 1 :(或等效地,-7 + -7)
1000
+ 1000
-------
1 0000
1
-------
0001