Is binary equality comparison of floats correct?
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
add a comment |
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
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
add a comment |
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
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
c++ floating-point std
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
add a comment |
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
add a comment |
2 Answers
2
active
oldest
votes
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 ==
:
+0.0 is defined to compare equal to -0.0.
NaN is defined to compare not-equal to NaN.
add a comment |
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
.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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 ==
:
+0.0 is defined to compare equal to -0.0.
NaN is defined to compare not-equal to NaN.
add a comment |
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 ==
:
+0.0 is defined to compare equal to -0.0.
NaN is defined to compare not-equal to NaN.
add a comment |
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 ==
:
+0.0 is defined to compare equal to -0.0.
NaN is defined to compare not-equal to NaN.
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 ==
:
+0.0 is defined to compare equal to -0.0.
NaN is defined to compare not-equal to NaN.
answered 56 mins ago
Bathsheba
175k27247371
175k27247371
add a comment |
add a comment |
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
.
add a comment |
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
.
add a comment |
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
.
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
.
answered 56 mins ago
Matthieu Brucher
12.2k22139
12.2k22139
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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