如何避免 expr 溢出。 A B C D

2024-01-03

我需要计算一个如下所示的表达式: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 - nn - 某个自然数。


我想这似乎太微不足道了。 但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(使用前将#替换为@)

如何避免 expr 溢出。 A B C D 的相关文章

随机推荐