【发布时间】:2012-10-20 13:56:43
【问题描述】:
我需要用 C/C++ 计算这个方程:
x=(a*b-1)/c;
使用 __int64 类型的 a,b,c,x (a,b,c,x
但是,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。
【问题讨论】:
-
执行 128 位算术作为四个 32 位数字?这不是那么难。甚至是汇编程序:
MOV, MUL, long decrement, DIV. -
他们(VC 等)还没有
int128?