Is binary equality comparison of floats correct?












7














I'm working on different memory block manipulation functions and during benchmarks I noticed, that my implementation of the IsEqualRange(double* begin1, double* end1, double* begin2, double* end2) is much faster then the std::equals(...) on MSVC and GCC as well. Further investigation showed, that doubles and floats are not block compared by memcmp, but in a for loop one by one.



In what situation does binary comparison of floats lead to incorrect result? When is it ok to binary compare (equality) array of floats/doubles? Are there other fundamental types where I shouldn't use memcmp?










share|improve this question






















  • Related: stackoverflow.com/questions/25808445/…
    – DeiDei
    56 mins ago










  • This answer to a related question is relevant to yours
    – Basile Starynkevitch
    53 mins ago






  • 1




    @BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
    – Zoltan Tirinda
    48 mins ago






  • 1




    Similar: stackoverflow.com/q/8044862/560648
    – Lightness Races in Orbit
    20 mins ago
















7














I'm working on different memory block manipulation functions and during benchmarks I noticed, that my implementation of the IsEqualRange(double* begin1, double* end1, double* begin2, double* end2) is much faster then the std::equals(...) on MSVC and GCC as well. Further investigation showed, that doubles and floats are not block compared by memcmp, but in a for loop one by one.



In what situation does binary comparison of floats lead to incorrect result? When is it ok to binary compare (equality) array of floats/doubles? Are there other fundamental types where I shouldn't use memcmp?










share|improve this question






















  • Related: stackoverflow.com/questions/25808445/…
    – DeiDei
    56 mins ago










  • This answer to a related question is relevant to yours
    – Basile Starynkevitch
    53 mins ago






  • 1




    @BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
    – Zoltan Tirinda
    48 mins ago






  • 1




    Similar: stackoverflow.com/q/8044862/560648
    – Lightness Races in Orbit
    20 mins ago














7












7








7







I'm working on different memory block manipulation functions and during benchmarks I noticed, that my implementation of the IsEqualRange(double* begin1, double* end1, double* begin2, double* end2) is much faster then the std::equals(...) on MSVC and GCC as well. Further investigation showed, that doubles and floats are not block compared by memcmp, but in a for loop one by one.



In what situation does binary comparison of floats lead to incorrect result? When is it ok to binary compare (equality) array of floats/doubles? Are there other fundamental types where I shouldn't use memcmp?










share|improve this question













I'm working on different memory block manipulation functions and during benchmarks I noticed, that my implementation of the IsEqualRange(double* begin1, double* end1, double* begin2, double* end2) is much faster then the std::equals(...) on MSVC and GCC as well. Further investigation showed, that doubles and floats are not block compared by memcmp, but in a for loop one by one.



In what situation does binary comparison of floats lead to incorrect result? When is it ok to binary compare (equality) array of floats/doubles? Are there other fundamental types where I shouldn't use memcmp?







c++ floating-point std






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 59 mins ago









Zoltan Tirinda

361419




361419












  • Related: stackoverflow.com/questions/25808445/…
    – DeiDei
    56 mins ago










  • This answer to a related question is relevant to yours
    – Basile Starynkevitch
    53 mins ago






  • 1




    @BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
    – Zoltan Tirinda
    48 mins ago






  • 1




    Similar: stackoverflow.com/q/8044862/560648
    – Lightness Races in Orbit
    20 mins ago


















  • Related: stackoverflow.com/questions/25808445/…
    – DeiDei
    56 mins ago










  • This answer to a related question is relevant to yours
    – Basile Starynkevitch
    53 mins ago






  • 1




    @BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
    – Zoltan Tirinda
    48 mins ago






  • 1




    Similar: stackoverflow.com/q/8044862/560648
    – Lightness Races in Orbit
    20 mins ago
















Related: stackoverflow.com/questions/25808445/…
– DeiDei
56 mins ago




Related: stackoverflow.com/questions/25808445/…
– DeiDei
56 mins ago












This answer to a related question is relevant to yours
– Basile Starynkevitch
53 mins ago




This answer to a related question is relevant to yours
– Basile Starynkevitch
53 mins ago




1




1




@BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
– Zoltan Tirinda
48 mins ago




@BasileStarynkevitch That is related to the nature of the floating points where not every number can be represented. Doesn't say much about the equality in binary form.
– Zoltan Tirinda
48 mins ago




1




1




Similar: stackoverflow.com/q/8044862/560648
– Lightness Races in Orbit
20 mins ago




Similar: stackoverflow.com/q/8044862/560648
– Lightness Races in Orbit
20 mins ago












2 Answers
2






active

oldest

votes


















14














The first thing I would do if I were you is to check your optimisation settings.



It's fine to use memcmp for an array of floating points but note that you could get different results to element-by-element ==:




  1. +0.0 is defined to compare equal to -0.0.


  2. NaN is defined to compare not-equal to NaN.







share|improve this answer





























    2














    The main issue is nan values, as these are never equal to themselves. So strictly speaking, you cannot use memcmp for them, as the answer would be mathematically incorrect.



    If you know that you don't have nan values, then you can use memcmp.






    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%2f54020760%2fis-binary-equality-comparison-of-floats-correct%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









      14














      The first thing I would do if I were you is to check your optimisation settings.



      It's fine to use memcmp for an array of floating points but note that you could get different results to element-by-element ==:




      1. +0.0 is defined to compare equal to -0.0.


      2. NaN is defined to compare not-equal to NaN.







      share|improve this answer


























        14














        The first thing I would do if I were you is to check your optimisation settings.



        It's fine to use memcmp for an array of floating points but note that you could get different results to element-by-element ==:




        1. +0.0 is defined to compare equal to -0.0.


        2. NaN is defined to compare not-equal to NaN.







        share|improve this answer
























          14












          14








          14






          The first thing I would do if I were you is to check your optimisation settings.



          It's fine to use memcmp for an array of floating points but note that you could get different results to element-by-element ==:




          1. +0.0 is defined to compare equal to -0.0.


          2. NaN is defined to compare not-equal to NaN.







          share|improve this answer












          The first thing I would do if I were you is to check your optimisation settings.



          It's fine to use memcmp for an array of floating points but note that you could get different results to element-by-element ==:




          1. +0.0 is defined to compare equal to -0.0.


          2. NaN is defined to compare not-equal to NaN.








          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 56 mins ago









          Bathsheba

          175k27247371




          175k27247371

























              2














              The main issue is nan values, as these are never equal to themselves. So strictly speaking, you cannot use memcmp for them, as the answer would be mathematically incorrect.



              If you know that you don't have nan values, then you can use memcmp.






              share|improve this answer


























                2














                The main issue is nan values, as these are never equal to themselves. So strictly speaking, you cannot use memcmp for them, as the answer would be mathematically incorrect.



                If you know that you don't have nan values, then you can use memcmp.






                share|improve this answer
























                  2












                  2








                  2






                  The main issue is nan values, as these are never equal to themselves. So strictly speaking, you cannot use memcmp for them, as the answer would be mathematically incorrect.



                  If you know that you don't have nan values, then you can use memcmp.






                  share|improve this answer












                  The main issue is nan values, as these are never equal to themselves. So strictly speaking, you cannot use memcmp for them, as the answer would be mathematically incorrect.



                  If you know that you don't have nan values, then you can use memcmp.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 56 mins ago









                  Matthieu Brucher

                  12.2k22139




                  12.2k22139






























                      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.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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%2f54020760%2fis-binary-equality-comparison-of-floats-correct%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

                      Eastern Orthodox Church

                      Zagreb

                      Understanding the information contained in the Deep Space Network XML data?