machine epsilon for float - i dont agree

  • Thread starter Thread starter Piotrekk
  • Start date Start date
P

Piotrekk

Hi
I have important question.
This is the way iam calculating machine epsilon

float fEps = 1.0f, fStore = 2.0f;
int i1 = 0;

// Calculating epsilon for float
while (fStore > 1.0f)
{
fEps /= 2;
fStore = fEps + 1.0f;
i1--;
}
i1++; fEps *=2;


Can anyone explain me why when i calculate using floats and obtain
float value :-0.0388556346
this value is smaller than calculated epsilon?
Thanks for your time.
My epsilon is: 1,1920929E-07 - true due to IEEE standards
PK
 
Piotrekk said:
Hi
I have important question.
This is the way iam calculating machine epsilon

float fEps = 1.0f, fStore = 2.0f;
int i1 = 0;

// Calculating epsilon for float
while (fStore > 1.0f)
{
fEps /= 2;
fStore = fEps + 1.0f;
i1--;
}
i1++; fEps *=2;


Can anyone explain me why when i calculate using floats and obtain
float value :-0.0388556346

Odd - I get: 2.220446E-16
this value is smaller than calculated epsilon?
Thanks for your time.
My epsilon is: 1,1920929E-07 - true due to IEEE standards

Because your variables are local variables, I believe the JIT is
actually deciding to keep them in the 80 bit floating point registers,
only converting them to real 32-bit floats where necessary. They're
therefore more precise than you might expect.

Try the following program, which is slightly different:
using System;

public class Test
{
static volatile float fStore=2.0f;

static void Main()
{
float fEps = 1.0f;
int i1 = 0;

// Calculating epsilon for float
while (fStore > 1.0f)
{
fEps /= 2;
fStore = fEps + 1.0f;
i1--;
}
i1++; fEps *=2;
Console.WriteLine (fEps);
}
}

Note that fStore is now a static variable (and volatile preventing any
"delayed writing" - it worked for me without it, but it doesn't hurt!)
you should find you get the expected answer.
 
Piotrekk said:
Nope. I am still gettin
1,1920929E-07

Do you think it might be caused by C# 2005?

I thought 1,1920929E-07 was what you expected to get. After all, you
wrote:

<quote>
My epsilon is: 1,1920929E-07 - true due to IEEE standards
</quote>

Is that not the value you're expecting?

Note that you're only using 32-bit floating point values here. If you
use doubles, you'll get 2.22044604925031E-16. Is that what you were
expecting? I'm not sure where you got the value of 0.0388556346 which
you mentioned in your original post - could you elaborate on that?

Note that your idea of epsilon (the smallest floating point such that
adding it to 1 gives a result distinct to 1) is not the same as the
values of Double.Epsilon or Single.Epsilon, each of which is the
smallest strictly positive value for that type. That's a much smaller
number in each case.

Given the definition of machine epsilon given at
http://www.netlib.org/lapack/lug/node74.html, I'm not sure how the
routine you've given is meant to be calculating it - I have to say
though, I haven't looked at xLAMCH myself, and possibly your code is
based on that.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top