代码之家  ›  专栏  ›  技术社区  ›  Dmitry Senkovich

是否有避免biginteger/bigdecimal的方法?

  •  -4
  • Dmitry Senkovich  · 技术社区  · 5 年前

    我需要计算这样的东西(伪代码):

    // 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,因为它太贵,不需要在其他任何地方使用。有没有一个聪明的数学解决方案,例如,有两个长的或类似的smth?

    谢谢您!

    更新 :抱歉,伙计们,还有一个约束:我还计算了一个变量,如下所示(也许它也可以重写):

    sum += x*y
    

    我需要重新计算它来与另一个变量进行比较以停止循环。

    2 回复  |  直到 5 年前
        1
  •  0
  •   Joakim Danielson    5 年前

    你可以分两次

    y = a / (b * c) 
    
    y1 = a / b
    
    y = y1 / c
    

    很难理解你是怎么用这个的 sum 准确地计算比较值,以及如何计算比较值,但是否可以存储比较结果,而不是避免较大的值,例如 result 然后0;然后 总和 较大,如果结果为<0,则其他值较大,…

        2
  •  0
  •   Dmitry Senkovich    5 年前

    我注意到我比较的值 sum 用久了。所以我用以下方法解决了这个问题:

    • 我正在计算 i 这样:(长)((A-N)/(双)X)/Y)
    • 这里去 j :(长)数学.ceil((b-n)/(双)x*y)
    • 当然,上面的情况是多余的。但是,我会防止溢出,在执行以下操作之前尝试捕获:

              try {
                      xy = Math.multiplyExact(x, y);
                      ...
              } catch (ArithmeticException ex) {
                      // some handling
                      break;
              }
      

    代码所做的这个技巧工作得足够快。

    希望它能帮助别人!