我需要计算一个如下所示的表达式:A*B - C*D
,其中它们的类型是:signed long long int A, B, C, D;
每个数字都可以很大(不溢出其类型)。尽管A*B
可能会导致溢出,同时表达A*B - C*D
可以非常小。我怎样才能正确计算它?
例如:MAX * MAX - (MAX - 1) * (MAX + 1) == 1
, where MAX = LLONG_MAX - n
n - 某个自然数。
我想这似乎太微不足道了。
但A*B
是可能溢出的那个。
您可以执行以下操作,而不会损失精度
A*B - C*D = A(D+E) - (A+F)D
= AD + AE - AD - DF
= AE - DF
^smaller quantities E & F
E = B - D (hence, far smaller than B)
F = C - A (hence, far smaller than C)
这种分解可以是进一步完成.
正如@Gian 指出的,如果类型是 unsigned long long,则在减法运算期间可能需要小心。
例如,对于问题中的情况,只需要一次迭代,
MAX * MAX - (MAX - 1) * (MAX + 1)
A B C D
E = B - D = -1
F = C - A = -1
AE - DF = {MAX * -1} - {(MAX + 1) * -1} = -MAX + MAX + 1 = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)