我有一个简单的问题,但是由于我使用的这种“编程语言”是 32 位的,并且仅支持加、减、乘、除和连接(字面意思就是这样)等基本功能,所以我遇到了一些麻烦。
对于输入,我有一个 16 位数字,如下所示:3334,5678,9523,4567
然后我想从这个数字中减去另外 2 个随机 16 位数字,并检查第一位和最后一位数字是否为 1。
例如,如果另外两个数字是 1111,1111,1111,1111 和 1234,5678,9123,4565。
我的最终数字将是:0988,8888,9288,8891。
这里,最后一个数字是 1,但第一个数字是 0,因此测试失败。
问题在于 32 位系统,由于位提供的精度不够,会出现大量错误。有哪些方法可以绕过此问题?
答案1
对于输入,我有一个 16 位数字,例如:3334,5678,9523,4567
这是一个 16 位数字十进制数字。
有什么方法可以绕过这个问题?
......这是一个非常独特的问题
这并不是什么新鲜事或“独特的” 问题,通常用 BCD 或多字整数解决。
浮点数强调的是数值范围大于精度,通常不足以解决问题,因为(二进制)双精度要求最多 16 位(十进制)有效数字,但对于小数部分却不准确(即 1/10 是无限二进制小数,就像 1/3 一样;参见本文)。
BCD(二进制编码的十进制)字符串允许无限精度(即位数)。
一些处理器甚至有促进 BCD 算术的机器指令。
对于金融应用,已经存在使用 BCD 算术的十进制(而非二进制)计算机。
字长为否位不限于整数的算术否位。
进位和借位标志算术逻辑单元方便对多个单词进行算术运算。
参见这是对“使用进位位和溢出位的原因”的回答。
计算密集型程序可能更喜欢多字整数或定点解决方案以获得速度优势。
输入/输出密集型程序(例如计算器)可能更喜欢 BCD 整数或定点解决方案以获得转换优势。四功能手持计算器通常使用 BCD(而不是二进制)算法。
附录
上述两种方案可以组合成一种混合方案。
使用 32 位整数 abinary-coded billion
可以代替(解包)字节和 a binary-coded decimal
。
不要使用字节来存储 0 到 9(含)之间的未打包值,而是扩展 BCD 的概念以使用 32 位整数来存储 0 到 999,999,999(含)之间的值。
要表示 16 位十进制数,binary-coded billion
需要两个 32 位字。
此存储要求与使用 64 位整数时相同。
二进制和十进制基数之间的转换比纯二进制多字更快,而算术比 BCD 更快。
这种混合方案继承了其起源的优势。