In C#: double d = 0.4 - 1.2; What is d?
-
Hehehe, I ran into this problem 15 years ago while writing a Fortran program.
I guess I should use decimals. Ivor S. Sargoytchev Dundas Software
-
I guess I should use decimals. Ivor S. Sargoytchev Dundas Software
Ivor S. Sargoytchev wrote: I guess I should use decimals. Decimals are very, very slow. Depending on what you're doing, there are techniques to workaround most IEEE rounding problems.
// Quantum sort algorithm implementation
while (!sorted)
; -
It is not since "if (d == -0.8)" will fail. Ivor S. Sargoytchev Dundas Software
Yes, but you should compare it like:
if (Math.Abs(d - 0.8) < Double.Epsilon)
And everything looks fine. See Double.Epsilon docs on MSDN.
// Quantum sort algorithm implementation
while (!sorted)
; -
Yes, but you should compare it like:
if (Math.Abs(d - 0.8) < Double.Epsilon)
And everything looks fine. See Double.Epsilon docs on MSDN.
// Quantum sort algorithm implementation
while (!sorted)
;Daniel, This is not true. Double.Epsilon is a very very very small number: Double.Epsilon = 4.94065645841247E-324 But in C# I get 0.4 - 1.2 = -0.79999999999999993. As you can see the deviation from -0.8 is hundreds of times bugger than 4.94065645841247E-324. Ivor S. Sargoytchev Dundas Software
-
It is not since "if (d == -0.8)" will fail. Ivor S. Sargoytchev Dundas Software
Ivor S. Sargoytchev wrote: if (d == -0.8) You're comparing floating point values for equality?? :omg: cheers, Chris Maunder
-
Ivor S. Sargoytchev wrote: if (d == -0.8) You're comparing floating point values for equality?? :omg: cheers, Chris Maunder
Chris, With respect, some constructive criticism please. Ivor S. Sargoytchev Dundas Software
-
Chris, With respect, some constructive criticism please. Ivor S. Sargoytchev Dundas Software
ok, you asked for it... It is *well known* (;P) that floating point numbers have a limited resolution (around 7 digits for single, 15 for double*), and comparing the result of an arithmetic operation using "==" is prone to err. if you know the order of magnitude of one comparand, or at least you know that it's "far enough" from zero, use the abs(a-b) < 1e-6*(abs of known comparand) comparison. Otherwise it gets a little bit more tricky. *) don't quote me on the numbers, look up the IEEE definitions for the format
"Der Geist des Kriegers ist erwacht / Ich hab die Macht" StS
sighist | Agile Programming | doxygen -
Chris, With respect, some constructive criticism please. Ivor S. Sargoytchev Dundas Software
The value represented in a floating point variable is only an approximation to a value, not an exact representation. Because of this you cannot assume that something like
2.0 == 4.0 * 0.5
will return true. When comparing floating point values you need to estimate how close is close enough then do a fuzzy comparision (something likeABS(A-B) < Epsilon
) cheers, Chris Maunder -
The value represented in a floating point variable is only an approximation to a value, not an exact representation. Because of this you cannot assume that something like
2.0 == 4.0 * 0.5
will return true. When comparing floating point values you need to estimate how close is close enough then do a fuzzy comparision (something likeABS(A-B) < Epsilon
) cheers, Chris MaunderChris Maunder wrote: The value represented in a floating point variable is only an approximation to a value, not an exact representation. Because of this you cannot assume that something like 2.0 == 4.0 * 0.5 will return true. So this is how you count your beer consumption isn't? Especially when Kiwi and Aussie mates are involved. ;P Michael Martin Australia "I personally love it because I can get as down and dirty as I want on the backend, while also being able to dabble with fun scripting and presentation games on the front end." - Chris Maunder 15/07/2002
-
Well? What is d equal to? Ivor S. Sargoytchev Dundas Software
If it's anything like C++, then d = -0.79999999999999993 ------------------------------------------ The ousted but stubbornly non-dead leader reportedly released an audiotape this weekend, ending by calling on Iraqis to, quote, "resist the occupation in any way you can, from writing on walls, to boycotting, to demonstrating and taking up arms." adding, "you know, pretty much anything I used to kill you for."
-
The value represented in a floating point variable is only an approximation to a value, not an exact representation. Because of this you cannot assume that something like
2.0 == 4.0 * 0.5
will return true. When comparing floating point values you need to estimate how close is close enough then do a fuzzy comparision (something likeABS(A-B) < Epsilon
) cheers, Chris MaunderChris Maunder wrote: 2.0 == 4.0 * 0.5 Won't that actually be true because all those numbers are powers of 2? :cool: --Mike-- Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber Latest art~!@#2rDFA#@(#*%$Rfa39f3fqwf--= NO CARRIER
-
Integer Math != IEEE Math Tim Smith I'm going to patent thought. I have yet to see any prior art.
That reminds me of the old C= BASIC, there was some number (I'll just use 42 as an example) where you could type:
PRINT 42
and the response would be:
42.0001
:wtf: --Mike-- Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber Latest art~!@#2rDFA#@(#*%$Rfa39f3fqwf--= NO CARRIER
-
Chris Maunder wrote: 2.0 == 4.0 * 0.5 Won't that actually be true because all those numbers are powers of 2? :cool: --Mike-- Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber Latest art~!@#2rDFA#@(#*%$Rfa39f3fqwf--= NO CARRIER
Yes it should... John
-
Well? What is d equal to? Ivor S. Sargoytchev Dundas Software
Ivor S. Sargoytchev wrote: Dundas Software THe only way you're going to get an answer in this crowd, when posting in the Lounge, is if you offer to hook us up with those women from the Summer Sale ads. :-D "When a man sits with a pretty girl for an hour, it seems like a minute. But let him sit on a hot stove for a minute and it's longer than any hour. That's relativity." - Albert Einstein
-
Daniel, This is not true. Double.Epsilon is a very very very small number: Double.Epsilon = 4.94065645841247E-324 But in C# I get 0.4 - 1.2 = -0.79999999999999993. As you can see the deviation from -0.8 is hundreds of times bugger than 4.94065645841247E-324. Ivor S. Sargoytchev Dundas Software
I think that what he meant was something like: if(abs(0.4-1.2)-0.8) < Double.Epsilon) which is the proper way to compare floating point numbers, i guess.
-
Ivor S. Sargoytchev wrote: Dundas Software THe only way you're going to get an answer in this crowd, when posting in the Lounge, is if you offer to hook us up with those women from the Summer Sale ads. :-D "When a man sits with a pretty girl for an hour, it seems like a minute. But let him sit on a hot stove for a minute and it's longer than any hour. That's relativity." - Albert Einstein
I agree.. :):laugh: John
-
I think that what he meant was something like: if(abs(0.4-1.2)-0.8) < Double.Epsilon) which is the proper way to compare floating point numbers, i guess.
This cannot be true since the absolute value of ((0.4 - 1.2) + 0.8) is 0.00000000000000011102230246251565. The value of Double.Epsilon is 4.94065645841247E-324, which is much much smaller.
-
Chris Maunder wrote: 2.0 == 4.0 * 0.5 Won't that actually be true because all those numbers are powers of 2? :cool: --Mike-- Ericahist | Homepage | RightClick-Encrypt | 1ClickPicGrabber Latest art~!@#2rDFA#@(#*%$Rfa39f3fqwf--= NO CARRIER
Michael Dunn wrote: Won't that actually be true because all those numbers are powers of 2? Yeah it will. Not a good choice of numbers huh? :)
Ryan
"Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
-
The value represented in a floating point variable is only an approximation to a value, not an exact representation. Because of this you cannot assume that something like
2.0 == 4.0 * 0.5
will return true. When comparing floating point values you need to estimate how close is close enough then do a fuzzy comparision (something likeABS(A-B) < Epsilon
) cheers, Chris MaunderSo Epsilon should be some value that you pick up, not Double.Epsilon as some people suggested, right? P.S. Chris, I know you are not supposed to compare 2 doubles with equality test. I was making a point that the result was not -0.8 as a response to leppie who wrote: "Thru a microscope, everything looks big. Believe me that is -0.8. Try Console.Write()." So, I accept your apology.:) Ivor S. Sargoytchev Dundas Software
-
Well? What is d equal to? Ivor S. Sargoytchev Dundas Software
I understand that this thread is not serious about anything, but very valid point has been raised. I would give you an answer: nobody knows... until native code is created. During days when C ruled you could heave an option of switching on/off coprocessor, floating point emulator library and etc. So, you can adjust precissions and etc... Now, looks like JIT should be creating best possible code depending on your computer configuration: what exactly does that mean for floating point case -- I didn't figure out yet. But yes, they will be alot of knowledgeable people on this thread willing to answer -- no doubt... "...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..." Me