有没有办法避免BigInteger/BigDecimal?
Is there a way to avoid BigInteger/BigDecimal?
我需要计算这样的东西(伪代码):
// a, b, x, y are long, x,y <= 10^12
long i = (a - n)/(x*y)
和
long j = (b - n)/(x*y) - ceiling
有时 x*y 不适合长。我想避免 BigDecimal/BigInteger 的使用,因为它太昂贵而且在其他任何地方都不需要。是否有智能数学解决方案,例如有两个多头或类似的东西?
谢谢!
更新:抱歉,伙计们,还有一个限制:我还有一个计算如下的变量(也许它也可以重写):
sum += x*y
我需要重新计算它以与另一个变量进行比较以停止循环。
你可以分两次
y = a / (b * c)
y1 = a / b
y = y1 / c
很难理解您如何准确地使用这个 sum
以及如何计算比较值,但是是否可以存储比较结果而不是避免大值,例如 if result
> 0 则 sum
较大,如果结果 < 0 则其他值较大,...
我注意到我比较 sum
的值很长。所以我通过以下方式解决了这个问题:
- 我正在这样计算
i
:(long) (((a - n) / (double) x) / y))
- 这里是
j
: (long) Math.ceil((b - n) / (double) x*y)
上面的例子当然溢出来了。但是我防止溢出之前进行以下尝试捕获:
try {
xy = Math.multiplyExact(x, y);
...
} catch (ArithmeticException ex) {
// some handling
break;
}
代码制作的这个技巧运行速度足够快。
希望对大家有所帮助!
我需要计算这样的东西(伪代码):
// a, b, x, y are long, x,y <= 10^12
long i = (a - n)/(x*y)
和
long j = (b - n)/(x*y) - ceiling
有时 x*y 不适合长。我想避免 BigDecimal/BigInteger 的使用,因为它太昂贵而且在其他任何地方都不需要。是否有智能数学解决方案,例如有两个多头或类似的东西?
谢谢!
更新:抱歉,伙计们,还有一个限制:我还有一个计算如下的变量(也许它也可以重写):
sum += x*y
我需要重新计算它以与另一个变量进行比较以停止循环。
你可以分两次
y = a / (b * c)
y1 = a / b
y = y1 / c
很难理解您如何准确地使用这个 sum
以及如何计算比较值,但是是否可以存储比较结果而不是避免大值,例如 if result
> 0 则 sum
较大,如果结果 < 0 则其他值较大,...
我注意到我比较 sum
的值很长。所以我通过以下方式解决了这个问题:
- 我正在这样计算
i
:(long) (((a - n) / (double) x) / y)) - 这里是
j
: (long) Math.ceil((b - n) / (double) x*y) 上面的例子当然溢出来了。但是我防止溢出之前进行以下尝试捕获:
try { xy = Math.multiplyExact(x, y); ... } catch (ArithmeticException ex) { // some handling break; }
代码制作的这个技巧运行速度足够快。
希望对大家有所帮助!