一个重要的考虑因素是您将使用什么基础来表示您的内部单位。正如其他人所说,这可能是单个单元的向量,然后您使用您在小学学到的那些“纸上”操作进行处理。也许是一个结构,它包含用于 mantassa 和 exponent 的单独向量以及用于它们每个符号的标志。但是这些单独的单元中发生了什么?
这种选择取决于这些操作的效率。
您可能会认为使用字符和以 10 为底的编码是最简单的编码方式,而且读取和写入函数非常简单!但实际上处理器在一次处理一个十进制字节时效率很低。不过,它非常适合读取数字!例如,做 56 * 37 将需要对“十进制”架构进行以下操作:
- 6 * 7 -> 42
- 42 / 10 -> ________ 4
- 42 %10 -> ___________ 2*
- 5 * 7 -> 35
- 35 / 10 -> ______ 3
- 35 %10 -> ________ 5
- 6 * 3 -> 18
- 18 / 10 -> ______ 1
- 18 %10 -> ________ 8
- 5 * 3 -> 15
- 15 / 10 -> ____ 1
- 15 %10 -> ______ 5
- 4 + 5 + 8 -> 17
- 17 / 10 -> ______ 1
- 17 %10 -> ________ 7*
- 3 + 1 + 5 + 1 -> 10
- 10 / 10 -> ____ 1
- 10 %10 -> ______ 0*
- 1 + 1 -> 2
- 2 /10 -> 0
- 2 % 2 -> ____ 2*
- 最终答案 __ 2 0 7 2
这是很多乘除运算,而且只有2位数!
您可能会认为使用整个字节 0-255 会更有效,而进行以 256 为基数的数学运算会更简单。尤其是当数字拆分 /10 和 %10 步骤变成简单的移位和掩码时!但是,在十进制显示中读取和写入任意长度的数字要困难得多,而且如果您决定使用以 2 为底的指数,那就更加困难了!
在 base 65536 中执行相同的数学运算效率更高,而在 64 位处理器上执行 base 4G 的数学运算效率更高,而打印的复杂性也不高。使用汇编器,您甚至可以使用 64 位存储和 128 位乘法运算!
每次将内部字长加倍时,乘法的部分运算次数就会减少 4,而除法的减少更为显着!
提高打印效率并保持数学合理有效的一种欺骗方法是将多个数字实际存储为每个存储单元中的二进制数。一个 32 位存储实际上可以在每个单元中保存一个最长为 9 位的整数。通过以 10 亿为底数进行数学运算,您只需每 9 位执行上述所有额外的数字拆分操作!
读取一个数字字符串涉及一次将 9 个数字读取到存储中,然后修复指数,我建议它仍然是 10 的幂。数字应始终以标准化的浮点格式在内部保存,其中只有一个小数点上方的数字(或者可能总是 0)。如果输入字符串在不同位置包含小数点,或者实际上是一个整数值,那么您可以通过摆弄指数值来修复它。数字始终以该格式或整数打印。这样,数字中未使用的数字始终位于最低有效单元的底部,如果它们为零,则它们是完全可用的。
在这个模式中,添加或减去 2 个具有不同指数的数字需要一些额外的工作,因为其中一个数字必须拆分为另一个数字的十亿对齐,然后才能求和,但加法仍然非常与乘法或除法相比,便宜。
将指数值本身读入保持向量很棘手,但也许您可以使用仅限于 64 位范围的指数,这意味着您不必对指数本身进行多字节操作?这允许数字高达 0.99E10sextillion(这是一个仅用于指数的 19 位数字),这对于大多数用途来说应该足够了。这假设指数仍然代表 10 的幂,这使得值的存储很方便,或者您可以以十亿的幂进行,“以指数方式”增加范围,但随后文本数字读取更加困难,因为读取数字必须重新对齐(类似于加/减预对齐的操作),但您也可以从不必进行加/减预对齐中受益。