0

目前我面临一个问题,当我将两个数字相乘时,它会从只能包含最大数字的最大范围
5e20 * 5e20 = 2.5E41
溢出。所以我不能将两个非常大的数字相乘,因此我的精度会降低。我想要精确到小数位。如果我也执行数字除法,我得到的只是因为我的系统不包含浮点,所以浮点部分被忽略。为了达到精度,我通过乘以得到 16 位小数精度来扩大我的红利。我还尝试使用科学记数法来解决我的精度问题,以便我可以通过书写进行乘法和除法,但正因为如此,我的乘法保持格式不变,而我的除法保持不变128 bit39 digits16
10 / 3 = 3.3333333
31e16
2.5/4 or 2.5x4

25x10^-14x10^0scale-downscaled-up形式
2.5/4 = 6.25E16 * 10^-1 (scaled up)
2.5*4 = 100 * 10^-1 (scaled down)

我怎么解决这个问题?我应该使用什么方法?

4

2 回答 2

1

没有简单的答案,您必须实现 256 位整数的运算(仍然不会帮助您的除法,您应该使用比例因子来表示您的数字),实现定点表示的运算,或运算对于浮点表示(尾数+指数),这些都不是微不足道的努力。

对于 256 位算术,有人创建了一个概念证明(但未经实战测试):https ://github.com/KStasi/clarity-uint256-lib 。她使用 4 个 uint64 能够使用 uint128 算术而不会溢出。
这是使用 8 位乘法器的 16 位乘法:https ://www.techiedelight.com/multiply-16-bit-integers-using-8-bit-multiplier/ 。你需要用 128 位数字做类似的事情。

同样,这里有一些用较低精度算术除法的指针:http: //www.mattmillman.com/mcs-48-the-quest-for-16-bit-division-on-the-8-bit-cpu -哪个不能划分任何东西/

代替使用比例因子,另一种方法是使用定点表示。有关理论,请参阅https://en.wikipedia.org/wiki/Fixed-point_arithmetic ,有关更实际的考虑,参阅 https://schaumont.dyn.wpi.edu/ece4703b20/lecture6.html (一些 DSP 有同样的问题,他们只有整数运算)。

于 2022-01-13T00:02:38.617 回答
0

这里的问题是两种操作的科学记数法不同。例如,
2.5/4 = 6.25E16 * 10^-1 (scaled up)
2.5*4 = 100 * 10^-1 (scaled down)
如果您在尾数中乘以 1e16,您可以简单地将 -16 添加到指数部分。所以你的答案变成 2.5/4 = 6.25E16 * 10^-1 (scaled up)
2.5/4 = 6.25E16 * 10^-1 * 10^-16
2.5/4 = 6.25E16 * 10^-17
2.5/4 = 0.625

有了这个,你的乘法和除法都是科学计数法,并产生实际的数字。

于 2022-01-13T07:09:41.670 回答