|
I didn't get your code why would i use epsilon ? and it has to be FLOAT
thx for reply.
cheers from canada
|
|
|
|
|
mohit`12 wrote: I didn't get your code why would i use epsilon ?
You yourself brought up the problem of floating point numbers being not perfect - if you read some of the links given you, you will realise that testing for equality is basically a waste of time. Digital computers simply do not do perfect representations of non-integers. Unless you're very lucky, and it's 1/(2^n). Two numbers can be reeeeeeeally close, and not equal. The simple fact you asked your original question shows that you know this already.
mohit`12 wrote: and it has to be FLOAT
So change double to float . Or whatever FLOA Ts your boat. Not the hardest of challenges!
Iain.
ps, My code will also cope (as it should) with negative floating values.
I am one of "those foreigners coming over here and stealing our jobs". Yay me!
|
|
|
|
|
I think you want
fabs
for C/C++.
|
|
|
|
|
viaducting wrote: I think you want fabs
You'd be right, too! That's what happens when you code in a text editor...
Not to worry - the OP is convinced all I typed was rubbish anyway!
But good to point out an error, in case it helps someone else.
Iain.
I am one of "those foreigners coming over here and stealing our jobs". Yay me!
|
|
|
|
|
I'm not a great one for going mental about code's performance but that's just horrible on so many levels. Why not do something like:
bool near_enough_equals( double a, double b )
{
return (b - a) < ( (b + a) / 2000.0 );
}
Cheers,
Ash
|
|
|
|
|
I am dealing with float and there is not way i can use DOUBLE for that particular code and my value might be negative so it might return negative value using your code and also b will be always less than a so negative
thx for reply
cheers from canada
|
|
|
|
|
Floats are converted to doubles before any serious arithmetic is done on them. The only reason you'd use a float is if you really had to save the 4 bytes (on most implementations). You actually introduce more arithmetic errors by saving everything as a float between calculations than doing everything as a double.
As for the negative problem, use std::fabs or something on the values before processing them:
bool are_these_two_near_enough( double a, double b )
{
a = std::fabs( a ); b = fabs( b );
return std::fabs( a - b ) < ( ( a + b ) / 2000.0 );
}
and if you're really worried about the difference between float and double use this as the function signature:
template< typename T >
bool are_these_two_floating_point_values_near_enough( T a, T b )
Edited as I didn't have all the HTML escapes properly sorted
modified on Tuesday, August 24, 2010 5:54 AM
|
|
|
|
|
mohit`12 wrote: if(value1==value2)
return true;
else
return false;
Ok, setting aside your real problem, why not simply code this as:
return (value1 == value2);
Call me anal if you like, but that's so much simpler and easier to read.
Once you agree to clans, tribes, governments...you've opted for socialism. The rest is just details.
|
|
|
|
|
Why use strings? Just round the values.
double a = 1.00003;
double b = 0.99997;
a *= 100;
b *= 100;
a += 0.5;
b += 0.5;
if (::floor(a) == ::floor(b))
{
}
|
|
|
|
|
floor will convert 0.099999787 to 0.10 ? and it has to be float value will it work ?
thx
cheers from canada.
|
|
|
|
|
a = 0.09999;
a *= 100;
a += 0.5;
floor(a);
b = 0.10001;
b *= 100;
b += 0.5;
floor(b);
|
|
|
|
|
... and use "ceil" to round up value
for example,
printf("ceil of 2.3 is %.1lf\n", ceil (2.3));
output
ceil of 2.3 is 3.0
to use the floor/ceil should be included math.h
Sorry for my poor english.
Best Regards,
Alexander S.
|
|
|
|
|
|
float a = 1.555;
float b = floor(a);
float c = ceil(a);
a = 0.09999;
b = floor(a);
c = ceil(a);
modified on Tuesday, August 24, 2010 1:56 AM
|
|
|
|
|
fasked wrote: Why add 0.5?
To turn floor() into a round()
|
|
|
|
|
using strings for numeric information when you don't need strings is never the right approach. For numerical problems, use a numeric solution.
Here are some possibilities:
1. you might put an upper limit on the deviation, similar to:
float is=0.999999877543;
float closeTo=1.0;
bool closeEnough=abs(is-closeTo)<0.01;
that would be close enough within 1% (since closeTo itself is one).
2. you might opt for a relative deviation (assuming the ideal value isn't zero):
float is=12.999999877543;
float closeTo=13.0;
bool closeEnough=abs((is-closeTo)/closeTo)<1.0e-6;
that would be close enough when within 1 ppm (pars pro million)
|
|
|
|
|
as i mentioned in previous post those value can be changed so and it may vary from negative to zero and zero to +2.707 E06 so not sure if that would work.
|
|
|
|
|
of course it can work. Whatever you can achieve with strings can be done without strings.
FYI: electronic circuit simulators use a combination of absolute and relative tolerance, so they would do a convergence test similar to the following:
float previous=...;
float current=...;
float threshold=0.1e-3;
if (abs(previous)>1) threshold+=abs(previous)*100.0e-6;
bool converged = abs(current-previous) < threshold;
in reality the two magic constants are variables, as the user is allowed to choose their value.
|
|
|
|
|
|
Nice link!
|
|
|
|
|
don't convert it to text just decide what the acceptable error is and compare ...
float error = 0.00000013;
float lowv = 0.1 - error;
float highv = 0.1 + error;
if ((lowv <= myfloat) && (highv >= myfloat)) {
} else {
}
|
|
|
|
|
I'm debugging IPP face detection demo console and in particular in the middle of the main where are:
...
int k, shda, shim, allpos;
int h = (pm + roi2.width - 1) / roi2.width;
int N = (roi2.height - classifierSize.height + 1 + h - classifierSize.height - 1) / (h - classifierSize.height + 1);
int X = (roi2.height - classifierSize.height + 1) / N;
int rem = (roi2.height - classifierSize.height + 1) % N;
...
Those are neither present at the locals window nor quickwatch or mouse hover can recognize them. What is the problem?
It can not also see customly defined types e.g. typedef unsigned char Ipp8u; a variable declared as Ipp8u* pData; is also invisible for IDE debugger.
Чесноков
|
|
|
|
|
Chesnokov Yuriy wrote: Those are neither present ...
Strange, I can see them in all those places. Are you sure they are in the block that you have stopped at, and also that you are running the Debug version of your project?
It's time for a new signature.
|
|
|
|
|
I always use debug version.
I stepped line by line after those variables declared and they are not visible
Чесноков
|
|
|
|
|
Chesnokov Yuriy wrote: I always use debug version.
I thought so, but still had to ask.
Chesnokov Yuriy wrote: I stepped line by line after those variables declared and they are not visible
As I said, I put those lines in a small test program and all were visible.
I can only assume something has gone wrong with one or more of the files containing the debug information. Try rebuilding the project and see if that changes anything.
It's time for a new signature.
|
|
|
|