我需要用 C/C++ 计算这个方程:
x=(a*b-1)/c;
使用 __int64 类型的 a,b,c,x (a,b,c,x<10^13)。在所有情况下,选择 a,b,c 以使 x 适合 __int64。
但是,a*b 非常大,会导致溢出,x 是错误的。
我尝试通过类型转换来分隔 a*b:
x=(__int64)(((double)a/c)*(double)b - 1.0/c);
这样,首先计算 a/c 并且不会发生溢出错误。
但是,问题是 ((double)a/c)*(double)b 有时值很大(大约数十亿)并且精度降低,因此 1.0/c(非常小)不起作用并导致错误+-1。
例如:(__int64)(((double)a/c)*(double)b=123456789.01更有可能变成123456789.0和1.0/c=0.02。这种情况下有+1的误差。
有没有办法在没有外部库(如 Boost 或 Bignum)的情况下计算 x 精确?即使有错误 +-1 也会搞砸我的代码。
提前致谢。
顺便说一句,我使用 Visual Studio 10。