我需要计算一个表达式,它看起来像:
例如:MAX * MAX - (MAX - 1) * (MAX + 1) == 1
,其中MAX = LLONG_MAX - n
和n是某个自然数.
我需要计算一个表达式,它看起来像:
例如:MAX * MAX - (MAX - 1) * (MAX + 1) == 1
,其中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)
这种分解可以是done further
例如,对于问题中的情况,只需一次迭代,
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