Is there a way to avoid BigInteger/BigDecimal?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







-4















I need to compute something like this (pseudocode):



// a, b, x, y are long, x,y <= 10^12

long i = (a - n)/(x*y)


and



long j = (b - n)/(x*y) - ceiling


Sometimes x*y doesn't fit in long. I would like to avoid BigDecimal/BigInteger usage as it is too costly and not needed anywhere else. Is there a smart math solution e.g. with two longs or smth like that?



Thank you!



UPDATE: Sorry, guys, one more constraint: I also have a variable computed as following (maybe it can be rewritten as well):



sum += x*y


I need to recalculate it to compare with another variable to stop the cycle.










share|improve this question

























  • Comments are not for extended discussion; this conversation has been moved to chat.

    – Samuel Liew
    Jan 3 at 23:13


















-4















I need to compute something like this (pseudocode):



// a, b, x, y are long, x,y <= 10^12

long i = (a - n)/(x*y)


and



long j = (b - n)/(x*y) - ceiling


Sometimes x*y doesn't fit in long. I would like to avoid BigDecimal/BigInteger usage as it is too costly and not needed anywhere else. Is there a smart math solution e.g. with two longs or smth like that?



Thank you!



UPDATE: Sorry, guys, one more constraint: I also have a variable computed as following (maybe it can be rewritten as well):



sum += x*y


I need to recalculate it to compare with another variable to stop the cycle.










share|improve this question

























  • Comments are not for extended discussion; this conversation has been moved to chat.

    – Samuel Liew
    Jan 3 at 23:13














-4












-4








-4








I need to compute something like this (pseudocode):



// a, b, x, y are long, x,y <= 10^12

long i = (a - n)/(x*y)


and



long j = (b - n)/(x*y) - ceiling


Sometimes x*y doesn't fit in long. I would like to avoid BigDecimal/BigInteger usage as it is too costly and not needed anywhere else. Is there a smart math solution e.g. with two longs or smth like that?



Thank you!



UPDATE: Sorry, guys, one more constraint: I also have a variable computed as following (maybe it can be rewritten as well):



sum += x*y


I need to recalculate it to compare with another variable to stop the cycle.










share|improve this question
















I need to compute something like this (pseudocode):



// a, b, x, y are long, x,y <= 10^12

long i = (a - n)/(x*y)


and



long j = (b - n)/(x*y) - ceiling


Sometimes x*y doesn't fit in long. I would like to avoid BigDecimal/BigInteger usage as it is too costly and not needed anywhere else. Is there a smart math solution e.g. with two longs or smth like that?



Thank you!



UPDATE: Sorry, guys, one more constraint: I also have a variable computed as following (maybe it can be rewritten as well):



sum += x*y


I need to recalculate it to compare with another variable to stop the cycle.







java algorithm optimization bigdecimal






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 3 at 8:57







Dmitry Senkovich

















asked Jan 3 at 8:29









Dmitry SenkovichDmitry Senkovich

2,14111541




2,14111541













  • Comments are not for extended discussion; this conversation has been moved to chat.

    – Samuel Liew
    Jan 3 at 23:13



















  • Comments are not for extended discussion; this conversation has been moved to chat.

    – Samuel Liew
    Jan 3 at 23:13

















Comments are not for extended discussion; this conversation has been moved to chat.

– Samuel Liew
Jan 3 at 23:13





Comments are not for extended discussion; this conversation has been moved to chat.

– Samuel Liew
Jan 3 at 23:13












2 Answers
2






active

oldest

votes


















0














You could divide two times



y = a / (b * c) 

y1 = a / b

y = y1 / c


It's hard to understand how you use this sum exactly and how the compared value is calculated but would it be possible to store the result of the comparison instead to avoid large values such as if result > 0 then sum is larger, if result < 0 then other value is larger,...






share|improve this answer


























  • seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

    – Dmitry Senkovich
    Jan 3 at 8:42



















0














I've noticed that the value I'm comparing the sum with is long. So I've solved the problem in the following way:




  • I'm calculating i like this: (long) (((a - n) / (double) x) / y))

  • Here goes j: (long) Math.ceil((b - n) / (double) x*y)


  • The case above overflows of course. But I prevent overflowing doing the following try-catch before:



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



This trick made by code work faster enough.



Hope it helps someone!






share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54018706%2fis-there-a-way-to-avoid-biginteger-bigdecimal%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You could divide two times



    y = a / (b * c) 

    y1 = a / b

    y = y1 / c


    It's hard to understand how you use this sum exactly and how the compared value is calculated but would it be possible to store the result of the comparison instead to avoid large values such as if result > 0 then sum is larger, if result < 0 then other value is larger,...






    share|improve this answer


























    • seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

      – Dmitry Senkovich
      Jan 3 at 8:42
















    0














    You could divide two times



    y = a / (b * c) 

    y1 = a / b

    y = y1 / c


    It's hard to understand how you use this sum exactly and how the compared value is calculated but would it be possible to store the result of the comparison instead to avoid large values such as if result > 0 then sum is larger, if result < 0 then other value is larger,...






    share|improve this answer


























    • seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

      – Dmitry Senkovich
      Jan 3 at 8:42














    0












    0








    0







    You could divide two times



    y = a / (b * c) 

    y1 = a / b

    y = y1 / c


    It's hard to understand how you use this sum exactly and how the compared value is calculated but would it be possible to store the result of the comparison instead to avoid large values such as if result > 0 then sum is larger, if result < 0 then other value is larger,...






    share|improve this answer















    You could divide two times



    y = a / (b * c) 

    y1 = a / b

    y = y1 / c


    It's hard to understand how you use this sum exactly and how the compared value is calculated but would it be possible to store the result of the comparison instead to avoid large values such as if result > 0 then sum is larger, if result < 0 then other value is larger,...







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Jan 3 at 12:42

























    answered Jan 3 at 8:34









    Joakim DanielsonJoakim Danielson

    10.6k3725




    10.6k3725













    • seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

      – Dmitry Senkovich
      Jan 3 at 8:42



















    • seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

      – Dmitry Senkovich
      Jan 3 at 8:42

















    seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

    – Dmitry Senkovich
    Jan 3 at 8:42





    seems to be reasonable but I also need to store the current sum of such m*w, sorry, I've updated the question

    – Dmitry Senkovich
    Jan 3 at 8:42













    0














    I've noticed that the value I'm comparing the sum with is long. So I've solved the problem in the following way:




    • I'm calculating i like this: (long) (((a - n) / (double) x) / y))

    • Here goes j: (long) Math.ceil((b - n) / (double) x*y)


    • The case above overflows of course. But I prevent overflowing doing the following try-catch before:



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



    This trick made by code work faster enough.



    Hope it helps someone!






    share|improve this answer




























      0














      I've noticed that the value I'm comparing the sum with is long. So I've solved the problem in the following way:




      • I'm calculating i like this: (long) (((a - n) / (double) x) / y))

      • Here goes j: (long) Math.ceil((b - n) / (double) x*y)


      • The case above overflows of course. But I prevent overflowing doing the following try-catch before:



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



      This trick made by code work faster enough.



      Hope it helps someone!






      share|improve this answer


























        0












        0








        0







        I've noticed that the value I'm comparing the sum with is long. So I've solved the problem in the following way:




        • I'm calculating i like this: (long) (((a - n) / (double) x) / y))

        • Here goes j: (long) Math.ceil((b - n) / (double) x*y)


        • The case above overflows of course. But I prevent overflowing doing the following try-catch before:



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



        This trick made by code work faster enough.



        Hope it helps someone!






        share|improve this answer













        I've noticed that the value I'm comparing the sum with is long. So I've solved the problem in the following way:




        • I'm calculating i like this: (long) (((a - n) / (double) x) / y))

        • Here goes j: (long) Math.ceil((b - n) / (double) x*y)


        • The case above overflows of course. But I prevent overflowing doing the following try-catch before:



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



        This trick made by code work faster enough.



        Hope it helps someone!







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 4 at 9:30









        Dmitry SenkovichDmitry Senkovich

        2,14111541




        2,14111541






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54018706%2fis-there-a-way-to-avoid-biginteger-bigdecimal%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            Npm cannot find a required file even through it is in the searched directory