1. RE: Uninitialized Variables

Chris Bensler wrote:
> I have thought of a way that we can determine if a variable is 
> uninitialized or not. We can also set it back to being uninitialized.
> 
> constant INF = (1e300*1e300),
> 
> integer  i   i = -INF
> atom     a   a = -INF
> sequence s   s =  INF
> object   o   o =  INF
> 
> I tried to use NAN as well, but everything is equal to NAN!?
> NAN=1
> NAN=-NAN
> NAN=INF
> NAN=-5039487
> 
> Is that proper behaviour?
> 

Chris:
   I don't think you understand what a uninitialized variable is.
   When a compiler or interpreter allocates a storage location
   to contain a variable. There is know way to know what that
   memory location contains. The variable is therefore
   called a unintialized variable. If the compiler or interpreter
   assigns a known value at creation time, then the variable
   is called a initialized variable. What you are doing above
   is assigning a known value to a uninitialized variable.
Bernie

new topic     » topic index » view message » categorize

2. RE: Uninitialized Variables

Sorry Bernie you misunderstood. This is a way AROUND that limitation. 
The best that I can think of.

 The circumstances are fairly limited to when it would be useful to know 
if a variable has been initialized yet. In those cases, I'm suggesting 
that you could just initialize it to -INF for atoms and integers, and 
INF for sequences and objects. Yes, there are cases where this wouldn't 
work, but they would be extremely rare.

Your program would then consider variables that contain -INF or INF are 
uninitialized.

I know it's not the optimal solution but it's better than none.

It would be next to optimal if NAN had a unique value. Then we could 
have a unique identifier for each uninitialized variable. I don't know 
the nature of NAN though, so I assume it's supposed to be equal to 
everything.


Chris


Bernie Ryan wrote:
> 
> Chris Bensler wrote:
> > I have thought of a way that we can determine if a variable is 
> > uninitialized or not. We can also set it back to being uninitialized.
> > 
> > constant INF = (1e300*1e300),
> > 
> > integer  i   i = -INF
> > atom     a   a = -INF
> > sequence s   s =  INF
> > object   o   o =  INF
> > 
> > I tried to use NAN as well, but everything is equal to NAN!?
> > NAN=1
> > NAN=-NAN
> > NAN=INF
> > NAN=-5039487
> > 
> > Is that proper behaviour?
> > 
> 
> Chris:
>    I don't think you understand what a uninitialized variable is.
>    When a compiler or interpreter allocates a storage location
>    to contain a variable. There is know way to know what that
>    memory location contains. The variable is therefore
>    called a unintialized variable. If the compiler or interpreter
>    assigns a known value at creation time, then the variable
>    is called a initialized variable. What you are doing above
>    is assigning a known value to a uninitialized variable.
> Bernie
> 
>

new topic     » goto parent     » topic index » view message » categorize

3. RE: Uninitialized Variables

> > > I tried to use NAN as well, but everything is equal to NAN!?
> > > NAN=1
> > > NAN=-NAN
> > > NAN=INF
> > > NAN=-5039487
> > > 
> > > Is that proper behaviour?
> > > 

I just ran into this problem yesterday -- how do you test for a nan?  It 
registers equal to everything if you use '=' but not equal().  The 
behavior also changes if you compile to C, and is different with every 
compiler.  This always works:

x = <nan>

if x and compare(x/x,1) then
 ...

(a nan passes the first test, which is neccessary to avoid div by zero 
for non-nans -- it also passes the second test, which for any real 
number will compare() to 0)

It also occured to be that the representation of a nan might be 
consistent if you atom_to_float() it, but I haven't tried that yet.  
Either way seems expensive -- is there a good way to test if something 
is a nan?

new topic     » goto parent     » topic index » view message » categorize

4. RE: Uninitialized Variables

Refer to my includeed original message, paragraph 4 :P.

It is useful nonetheless.
No, you can't use it in 3rd-party libs, because it's a manual 
convention. And no, you can't use it in cases where you are dealing with 
extremeley large numbers.

The factor that it's a manual effeort is a nuisance, but worst case, you 
run your program, and it tells you that's it's uninitialized (heh, 
oxymoron).


I know it's not the solution, but I have stumbled on this case before, 
and my method would have worked just fine.


Chris


Derek Parnell wrote:
> ----- Original Message -----
> From: "Chris Bensler" <bensler at mail.com>
> To: "EUforum" <EUforum at topica.com>
> Sent: Sunday, March 24, 2002 8:00 AM
> Subject: RE: Uninitialized Variables
> 
> 
> >
> > Sorry Bernie you misunderstood. This is a way AROUND that limitation.
> > The best that I can think of.
> >
> >  The circumstances are fairly limited to when it would be useful to know
> > if a variable has been initialized yet. In those cases, I'm suggesting
> > that you could just initialize it to -INF for atoms and integers, and
> > INF for sequences and objects. Yes, there are cases where this wouldn't
> > work, but they would be extremely rare.
> >
> > Your program would then consider variables that contain -INF or INF are
> > uninitialized.
> >
> > I know it's not the optimal solution but it's better than none.
> >
> > It would be next to optimal if NAN had a unique value. Then we could
> > have a unique identifier for each uninitialized variable. I don't know
> > the nature of NAN though, so I assume it's supposed to be equal to
> > everything.
> >
> 
> A nice try. But it has at least three remaining problems:
> 
>   a) It is a manual effort. So if you forget to do it, something will fail
> somewhere.
> 
>   b) It can't be relied on for use inside 3rd-party library files. IOW, if 
>   I
> write a library routine that includes a function written like:
> 
>       global function xx(sequence s)
>            -- check for uninitialized parameter.
>            if equal(s,INF) then
>               s = ""
>            end if
>            . . .
>       end function
> 
> and this library is included by somebody in their program, I cannot rely 
> on
> them using the INF convention. And likewise, if I use a somebody else's
> library function, I can't rely on them testing for uninitialized values 
> in
> this manner.
> 
>   c) Unfortunatly, INF is a valid value in its own right, and can be used 
>   in
> situations other than checking for uninitialized variables.
> 
> The problem really needs to be addressed inside the core Eu interpreter. 
> It
> knows if a variable is truely initialized or not. The changes are 
> simple.
>    - Allow uninitialized variables to be passed as parameters.
>    - Create a built-in way of testing a variable's initialization state.
> 
> and possibly
> 
>    - Create a built-in way of setting a variable's state back to
> uninitialized.
> 
> This will not break any existing code, and will enable people to write 
> more
> robust code.
> 
> ------------
> Derek.
> 
> 
>

new topic     » goto parent     » topic index » view message » categorize

5. RE: Uninitialized Variables

Andy Serpa wrote:
> 
> > > > I tried to use NAN as well, but everything is equal to NAN!?
> > > > NAN=1
> > > > NAN=-NAN
> > > > NAN=INF
> > > > NAN=-5039487
> > > > 
> > > > Is that proper behaviour?
> > > > 
> 
> I just ran into this problem yesterday -- how do you test for a nan?  It 
> 
> registers equal to everything if you use '=' but not equal().  The 
> behavior also changes if you compile to C, and is different with every 
> compiler.  This always works:
> 
> x = <nan>
> 
> if x and compare(x/x,1) then
>  ...
> 
> (a nan passes the first test, which is neccessary to avoid div by zero 
> for non-nans -- it also passes the second test, which for any real 
> number will compare() to 0)
> 
> It also occured to be that the representation of a nan might be 
> consistent if you atom_to_float() it, but I haven't tried that yet.  
> Either way seems expensive -- is there a good way to test if something 
> is a nan?
> 

Apparently NAN is (silly me) Not A Number! :P
using equal() compares NAN properly and consistently

Here is my revised uninitialized values for variables:

   integer  = -INF
   atom     =  INF
   sequence =  NAN
   object   = -NAN

Chris

new topic     » goto parent     » topic index » view message » categorize

6. RE: Uninitialized Variables

> 
> Apparently NAN is (silly me) Not A Number! :P
> using equal() compares NAN properly and consistently
> 
> Here is my revised uninitialized values for variables:
> 
>    integer  = -INF
>    atom     =  INF
>    sequence =  NAN
>    object   = -NAN
> 

So how do I test if something is a nan?  The "official" way is to use 
x!=x, but that is usually optimized away by most compilers (& Euphoria, 
apparently.)  Using something like if x=1 and x=2 will work in the 
interpreter, but not translated to C, even with Watcom.  (In fact, it is 
different depending on the compiler).

Am I stuck with "if x and compare(x/x,1)"?

For my genetic programming system this is a very real problem, as it 
comes up with random mathmatical expressions that sometimes are nan's.  
If you then take a predicted value (which is a nan) as output for a 
function that it has created and compare it with a target value, it will 
show as being equal (& therefore error = 0).  So functions with nan's as 
output get the highest fitness, which is a disaster...

new topic     » goto parent     » topic index » view message » categorize

7. RE: Uninitialized Variables

You need to use equal(), instead of =

? not equal(324876,NAN)


Chris

Andy Serpa wrote:
> 
> 
> > Apparently NAN is (silly me) Not A Number! :P
> > using equal() compares NAN properly and consistently
> > 
> > Here is my revised uninitialized values for variables:
> > 
> >    integer  = -INF
> >    atom     =  INF
> >    sequence =  NAN
> >    object   = -NAN
> > 
> 
> So how do I test if something is a nan?  The "official" way is to use 
> x!=x, but that is usually optimized away by most compilers (& Euphoria, 
> apparently.)  Using something like if x=1 and x=2 will work in the 
> interpreter, but not translated to C, even with Watcom.  (In fact, it is 
> 
> different depending on the compiler).
> 
> Am I stuck with "if x and compare(x/x,1)"?
> 
> For my genetic programming system this is a very real problem, as it 
> comes up with random mathmatical expressions that sometimes are nan's.  
> If you then take a predicted value (which is a nan) as output for a 
> function that it has created and compare it with a target value, it will 
> 
> show as being equal (& therefore error = 0).  So functions with nan's as 
> 
> output get the highest fitness, which is a disaster...
> 
>

new topic     » goto parent     » topic index » view message » categorize

8. RE: Uninitialized Variables

> 
> This seems to work:
> --------------
> atom x,nan,inf
> inf = 1e300 * 1e300
> nan = inf / inf
> 
> x = nan
> 
> if x = nan then
>     puts(1, "x is not a number\n")
> end if
> ? x = nan
> ? x != nan
> 

Actually, it doesn't.  Because

(10 = nan)
(2.3 = nan)

will also evaluate as true and

(10 != nan)

will evaluate as false.

You need to be able to tell a non-nan from a nan...

new topic     » goto parent     » topic index » view message » categorize

9. RE: Uninitialized Variables

Yeah, I tried it, and is definitely *NOT* what I get -- maybe it is a 
CPU thing.  I have an AMDK6-2/450.

For this version I get:

x is not a number
y is not a number
1
0
1
0
1
0
-nan
inf

Now I checked atom_to_float32()/float32_to_atom() and that works 
consistently -- note that (nan) & (-nan) are different though.

Derek Parnell wrote:
> > > 
> > > This seems to work:
> > > --------------
> > > atom x,nan,inf
> > > inf = 1e300 * 1e300
> > > nan = inf / inf
> > > 
> > > x = nan
> > > 
> > > if x = nan then
> > >     puts(1, "x is not a number\n")
> > > end if
> > > ? x = nan
> > > ? x != nan
> > > 
> > 
> > Actually, it doesn't.  Because
> > 
> > (10 = nan)
> > (2.3 = nan)
> > 
> > will also evaluate as true and
> > 
> > (10 != nan)
> > 
> > will evaluate as false.
> > 
> > You need to be able to tell a non-nan from a nan...
> > 
> 
> Umm, did you actually try it, Andy. Here is an expanded version:
> 
> ------------------
> 
> atom x,y,nan,inf
> inf = 1e300 * 1e300
> nan = inf / inf
> 
> x = nan
> y = 10
> if x = nan then
>     puts(1, "x is not a number\n")
> else
>     puts(1, "x is a number\n")
> end if
> if y = nan then
>     puts(1, "y is not a number\n")
> else
>     puts(1, "y is a number\n")
> end if
> ? x = nan
> ? x != nan
> ? y = nan
> ? y != nan
> ? 10 = nan
> ? 10 != nan
> 
> ? nan
> ? inf
> ------------------
> 
> I get the following output:
> 
> x is not a number
> y is a number
> 1
> 0
> 0
> 1
> 0
> 1
> -nan
> inf
> 
> -------------
> which seems just what I'd expect.
> 
> ----------
> Derek.
> 
>

new topic     » goto parent     » topic index » view message » categorize

10. RE: Uninitialized Variables

Derek Parnell wrote:
> ----- Original Message ----- 
> From: "Andy Serpa" <renegade at earthling.net>
> To: "EUforum" <EUforum at topica.com>
> Sent: Sunday, March 24, 2002 10:18 AM
> Subject: RE: Uninitialized Variables
> 
> 
> > > Apparently NAN is (silly me) Not A Number! :P
> > > using equal() compares NAN properly and consistently
> > > 
> > > Here is my revised uninitialized values for variables:
> > > 
> > >    integer  = -INF
> > >    atom     =  INF
> > >    sequence =  NAN
> > >    object   = -NAN
> > > 
> > 
> > So how do I test if something is a nan?  The "official" way is to use 
> > x!=x, but that is usually optimized away by most compilers (& Euphoria, 
> > apparently.)  Using something like if x=1 and x=2 will work in the 
> > interpreter, but not translated to C, even with Watcom.  (In fact, it is 
> > 
> > different depending on the compiler).
> > 
> > Am I stuck with "if x and compare(x/x,1)"?
> > 
> > For my genetic programming system this is a very real problem, as it 
> > comes up with random mathmatical expressions that sometimes are nan's.  
> > If you then take a predicted value (which is a nan) as output for a 
> > function that it has created and compare it with a target value, it will 
> > 
> > show as being equal (& therefore error = 0).  So functions with nan's as 
> > 
> > output get the highest fitness, which is a disaster...
> > 
> 
> This seems to work:
> --------------
> atom x,nan,inf
> inf = 1e300 * 1e300
> nan = inf / inf
> 
> x = nan
> 
> if x = nan then
>     puts(1, "x is not a number\n")
> end if
> ? x = nan
> ? x != nan
> 
> ? nan
> ? inf
> ------------
> 
> 

Derek, try this.

? x=nan
? x=inf
? x=10

btw:   nan = -(inf/inf)


Chris

new topic     » goto parent     » topic index » view message » categorize

11. RE: Uninitialized Variables

No difference on my system.  It might also be you are being tripped up 
by an optimization:

atom x,y,nan,inf
inf = 1e300 * 1e300
nan = inf / inf

x = nan

Now equal(x,nan) will be TRUE, probably because Euphoria doesn't 
actually even compare them, since they both will share the same internal 
pointer at this point.

Now do:

y = x + 5   <= y is now also a nan (actually -nan)

? equal(y,nan)  

-- This is FALSE.  Once again, we can't determine a nan this way.
? x
? y

-nan
-nan


Chris Bensler wrote:
> You need to use equal(), instead of =
> 
> ? not equal(324876,NAN)
> 
> 
> Chris
> 
> Andy Serpa wrote:
> > 
> > 
> > > Apparently NAN is (silly me) Not A Number! :P
> > > using equal() compares NAN properly and consistently
> > > 
> > > Here is my revised uninitialized values for variables:
> > > 
> > >    integer  = -INF
> > >    atom     =  INF
> > >    sequence =  NAN
> > >    object   = -NAN
> > > 
> > 
> > So how do I test if something is a nan?  The "official" way is to use 
> > x!=x, but that is usually optimized away by most compilers (& Euphoria, 
> > apparently.)  Using something like if x=1 and x=2 will work in the 
> > interpreter, but not translated to C, even with Watcom.  (In fact, it is 
> > 
> > 
> > different depending on the compiler).
> > 
> > Am I stuck with "if x and compare(x/x,1)"?
> > 
> > For my genetic programming system this is a very real problem, as it 
> > comes up with random mathmatical expressions that sometimes are nan's.  
> > If you then take a predicted value (which is a nan) as output for a 
> > function that it has created and compare it with a target value, it will 
> > 
> > 
> > show as being equal (& therefore error = 0).  So functions with nan's as 
> > 
> > 
> > output get the highest fitness, which is a disaster...
> > 
> >

new topic     » goto parent     » topic index » view message » categorize

12. RE: Uninitialized Variables

Derek Parnell wrote:
> ----- Original Message -----
> From: "Chris Bensler" <bensler at mail.com>
> To: "EUforum" <EUforum at topica.com>
> Sent: Sunday, March 24, 2002 10:58 AM
> Subject: RE: Uninitialized Variables
> 
> 
> > Derek Parnell wrote:
> > > ----- Original Message -----
> > > From: "Andy Serpa" <renegade at earthling.net>
> > > To: "EUforum" <EUforum at topica.com>
> > > Sent: Sunday, March 24, 2002 10:18 AM
> > > Subject: RE: Uninitialized Variables
> > >
> > >
> > > > > Apparently NAN is (silly me) Not A Number! :P
> > > > > using equal() compares NAN properly and consistently
> > > > >
> > > > > Here is my revised uninitialized values for variables:
> > > > >
> > > > >    integer  = -INF
> > > > >    atom     =  INF
> > > > >    sequence =  NAN
> > > > >    object   = -NAN
> > > > >
> > > >
> > > > So how do I test if something is a nan?  The "official" way is to use
> > > > x!=x, but that is usually optimized away by most compilers (&
> Euphoria,
> > > > apparently.)  Using something like if x=1 and x=2 will work in the
> > > > interpreter, but not translated to C, even with Watcom.  (In fact, it
> is
> > > >
> > > > different depending on the compiler).
> > > >
> > > > Am I stuck with "if x and compare(x/x,1)"?
> > > >
> > > > For my genetic programming system this is a very real problem, as it
> > > > comes up with random mathmatical expressions that sometimes are nan's.
> > > > If you then take a predicted value (which is a nan) as output for a
> > > > function that it has created and compare it with a target value, it
> will
> > > >
> > > > show as being equal (& therefore error = 0).  So functions with nan's
> as
> > > >
> > > > output get the highest fitness, which is a disaster...
> > > >
> > >
> > > This seems to work:
> > > --------------
> > > atom x,nan,inf
> > > inf = 1e300 * 1e300
> > > nan = inf / inf
> > >
> > > x = nan
> > >
> > > if x = nan then
> > >     puts(1, "x is not a number\n")
> > > end if
> > > ? x = nan
> > > ? x != nan
> > >
> > > ? nan
> > > ? inf
> > > ------------
> > >
> > >
> > Derek, try this.
> >
> > ? x=nan
> > ? x=inf
> > ? x=10
> >
> > btw:   nan = -(inf/inf)
> >
> >
> > Chris
> >
> >
> Okay, I did those changes and now I get this:
> 
> x is not a number
> y is a number
> 1
> 0
> 0
> 1
> 0
> 1
> 1
> 0
> 0
> nan
> inf
<snip>

it's not a CPU thing.

This works for me...

-------------------
atom x,y,nan,inf
inf = 1e300 * 1e300
nan = -(inf / inf) -- ( inf / inf = -nan )

? equal(10,nan)
? not equal(10,nan)
? equal(nan,nan)
-------------------

my results are:
0
1
1


Chris

new topic     » goto parent     » topic index » view message » categorize

13. RE: Uninitialized Variables

Derek Parnell wrote:
> >
> > it's not a CPU thing.
> >
> > This works for me...
> >
> > -------------------
> > atom x,y,nan,inf
> > inf = 1e300 * 1e300
> > nan = -(inf / inf) -- ( inf / inf = -nan )
> >
> > ? equal(10,nan)
> > ? not equal(10,nan)
> > ? equal(nan,nan)
> > -------------------
> >
> > my results are:
> > 0
> > 1
> > 1
> >
> >
> > Chris
> 
> Great. I get the same as you. I even get the same when using '=' rather 
> than
> 'equal()'.
> 
> ? 10 = nan
> ? not (10 = nan)
> ? nan = nan
> 
> Chris, what CPU are use running with? Why does Andy get different 
> results?
> 
> 

How odd.
I'm SURE I didn't snip your msg.
If I did, I would have wrote <SNIP>. I always capitalize those tags.

A portion of my post is also missing. I assume that is what was snipped. 
Probably something to do with the auto moderator.

I'll try again...

I get the same results as Andy gets for your example. Like you, I'm also 
using a PIII, so it's not a CPU thing.

This works for me...

-------------------
atom x,y,nan,inf
inf = 1e300 * 1e300
nan = -(inf / inf) -- ( inf / inf = -nan )

? equal(10,nan)
? not equal(10,nan)
? equal(nan,nan)
-------------------

my results are:
0
1
1


Chris

new topic     » goto parent     » topic index » view message » categorize

14. RE: Uninitialized Variables

If this message comes through twice, I'm sorry -- the web interface is 
very slow today:

Ok, here's the test so we don't get tricked by the optimizer:
equal(anything,copy of anything) will always be true -- you have to make 
a nan that isn't just a copy of your definition.

-------------------
atom x,y,nan,inf, z, unknown
inf = 1e300 * 1e300
nan = -(inf / inf) -- ( inf / inf = -nan )

x = 10         -- not a nan
y = -tan(inf)  -- a nan
z = nan        -- a different nan
----------------------------

Now, assume you don't know what x,y, & z are.  Show me a way to identify 
the nans & non-nans, AND continues to work when translated to C (except 
with Borland -- all of these big number things crash Borland).

THIS works in all cases I know of:
------------------------------------
unknown = x

if unknown and compare(unknown/unknown,1) then
	puts(1,"NAN!\n")
else
	puts(1,"non-NAN!\n")
end if

unknown = y

if unknown and compare(unknown/unknown,1) then
	puts(1,"NAN!\n")
else
	puts(1,"non-NAN!\n")
end if

unknown = z

if unknown and compare(unknown/unknown,1) then
	puts(1,"NAN!\n")
else
	puts(1,"non-NAN!\n")
end if


---------------

This works in the interpreter, but not when compiled:

unknown = x

if unknown = 1 and unknown = 2 then
	puts(1,"NAN!\n")
else
	puts(1,"non-NAN!\n")
end if
-----------------


As I said, using atom_to_float32() also would work it seems, but you 
have to account for nan & -nan.


So one way involves two comparisons & a division; the other involves 
converting to a sequence & then up to two comparisions.  Isn't there a 
cheaper way?

new topic     » goto parent     » topic index » view message » categorize

15. RE: Uninitialized Variables

-------Phoenix-Boundary-07081998-

Hi Andy Serpa, you wrote on 3/23/02 6:09:54 PM:

<SNIP>

>
>So one way involves two comparisons & a division; the other involves
>converting to a sequence & then up to two comparisions.  Isn't there a
>cheaper way?
>

I tried your code and it failed for me -- the 'y'
case came out "non-NaN"

Have you tried:
    if unknown >= 1e255 then
       puts( 1, "it's a NaN!")
    ....

Works under the interpreter but I haven't tried the compiler
The '1e255' comes directly from the IEEE 754 NaN definition,
so it should be o.k.

The test probably should be:
    if unknown >= 1e255 or unknown <= -1e255 then

Karl Bochert

-------Phoenix-Boundary-07081998---

new topic     » goto parent     » topic index » view message » categorize

16. RE: Uninitialized Variables

> 
> I tried your code and it failed for me -- the 'y'
> case came out "non-NaN"
> 

Boy, what a nightmare. 


> Have you tried:
>     if unknown >= 1e255 then
>        puts( 1, "it's a NaN!")
>     ....
> 
> Works under the interpreter but I haven't tried the compiler
> The '1e255' comes directly from the IEEE 754 NaN definition,
> so it should be o.k.
> 
> The test probably should be:
>     if unknown >= 1e255 or unknown <= -1e255 then
> 
> Karl Bochert
> 

Well, Euphoria handles atoms up to 1e300 or so, and after that they end 
up as "inf", which is something else entirely.  So maybe 
atom_to_float32() is the only reliable way, which uses IEEE format...

new topic     » goto parent     » topic index » view message » categorize

17. RE: Uninitialized Variables

-------Phoenix-Boundary-07081998-

Hi Andy Serpa, you wrote on 3/23/02 10:13:12 PM:

>> I tried your code and it failed for me -- the 'y'
>> case came out "non-NaN"

>
>Boy, what a nightmare.
>
You sure got that right. My method is useless.
Have you noticed that real math (IEEE 754) has
+infinity, -infinity, quiet NaNs, signaling NaNs,
indeterminates, as well as normalized and
denormalized numbers!
Combine that with Eu's 'atoms' which change silently
from integers to doubles.
The best solution may be a DLL that knows how to ask the
floating point processor (nicely) for its secrets.

Karl Bochert

-------Phoenix-Boundary-07081998---

new topic     » goto parent     » topic index » view message » categorize

18. RE: Uninitialized Variables

kbochert at ix.netcom.com wrote:
> -------Phoenix-Boundary-07081998-
> Content-type: text/plain; charset=ISO-8859-1
> Content-transfer-encoding: 8bit
> 
> Hi Andy Serpa, you wrote on 3/23/02 10:13:12 PM:
> 
> >> I tried your code and it failed for me -- the 'y'
> >> case came out "non-NaN"
> 
> >
> >Boy, what a nightmare.
> >
> You sure got that right. My method is useless.
> Have you noticed that real math (IEEE 754) has
> +infinity, -infinity, quiet NaNs, signaling NaNs,
> indeterminates, as well as normalized and
> denormalized numbers!
> Combine that with Eu's 'atoms' which change silently
> from integers to doubles.
> The best solution may be a DLL that knows how to ask the
> floating point processor (nicely) for its secrets.
> 

Been looking for one, but haven't found one that's compiled already.  I 
never get get c source to compile correctly...

new topic     » goto parent     » topic index » view message » categorize

19. RE: Uninitialized Variables

kbochert at ix.netcom.com wrote:
> You sure got that right. My method is useless.
> Have you noticed that real math (IEEE 754) has
> +infinity, -infinity, quiet NaNs, signaling NaNs,
> indeterminates, as well as normalized and
> denormalized numbers!
> Combine that with Eu's 'atoms' which change silently
> from integers to doubles.
> The best solution may be a DLL that knows how to ask the
> floating point processor (nicely) for its secrets.
> 

Karl:
  You can use the floating point processor with assembler
  in euphoria. asm.e supports the floating point processor.
Bernie

new topic     » goto parent     » topic index » view message » categorize

20. RE: Uninitialized Variables

Derek Parnell wrote:
<snip>
>   c) Unfortunatly, INF is a valid value in its own right, and can be used 
>   in
> situations other than checking for uninitialized variables.
> 
> The problem really needs to be addressed inside the core Eu interpreter. 
> It
> knows if a variable is truely initialized or not. The changes are 
> simple.
>    - Allow uninitialized variables to be passed as parameters.
>    - Create a built-in way of testing a variable's initialization state.
> 
> and possibly
> 
>    - Create a built-in way of setting a variable's state back to
> uninitialized.
> 
> This will not break any existing code, and will enable people to write 
> more
> robust code.

But uninitialized variables are caught at "compile" time. Why
would you want to wait until runtime to catch them? What would
be the point?

Rod

new topic     » goto parent     » topic index » view message » categorize

21. RE: Uninitialized Variables

Andy Serpa wrote:
<snip> 
> So how do I test if something is a nan?  The "official" way is to use 
> x!=x, but that is usually optimized away by most compilers (& Euphoria, 
> apparently.)  Using something like if x=1 and x=2 will work in the 
> interpreter, but not translated to C, even with Watcom.  (In fact, it is 
> 
> different depending on the compiler).
> 
> Am I stuck with "if x and compare(x/x,1)"?
> 
> For my genetic programming system this is a very real problem, as it 
> comes up with random mathmatical expressions that sometimes are nan's.  
> If you then take a predicted value (which is a nan) as output for a 
> function that it has created and compare it with a target value, it will 
> 
> show as being equal (& therefore error = 0).  So functions with nan's as 
> 
> output get the highest fitness, which is a disaster...

Andy,

If you don't mind me asking, what sorts of expressions are
your genes coming up with that yield NAN? Are you using
INF on occasion? Or square root of negative numbers? I'm
asking because, while this needs to be addressed (and so
far the discussion is very revealing,) it might save you time
if a workaround can be found.

Rod

new topic     » goto parent     » topic index » view message » categorize

22. RE: Uninitialized Variables

> If you don't mind me asking, what sorts of expressions are
> your genes coming up with that yield NAN? Are you using
> INF on occasion? Or square root of negative numbers? I'm
> asking because, while this needs to be addressed (and so
> far the discussion is very revealing,) it might save you time
> if a workaround can be found.
> 

I have simple checks to avoid division by zero, taking the log of a 
negative, etc., but if you mix a bunch of random mathmatical functions 
with a bunch of random values, you're going to get some strange results 
sometimes.  The checks I have are all for *before* a function is 
performed.  For instance, if the second argument is zero in a division, 
don't do the calculation.  This will avoid an outright crash.  Other 
functions, like tan(), will output nan or -nan if the value going in is 
too extreme.  Since it doesn't actually crash, it would be much easier 
to check for a nan after the function is performed then try to set 
strict limits that must be checked before each individual function is 
performed.  If I can check for nans reliably, I can just set up a custom 
"non_nan" type that catches it (a type that always returns TRUE to avoid 
a crash, but sets another global flag so I can throw out that function 
internally)...

new topic     » goto parent     » topic index » view message » categorize

23. RE: Uninitialized Variables

Andy Serpa wrote:
> 
> > If you don't mind me asking, what sorts of expressions are
> > your genes coming up with that yield NAN? Are you using
> > INF on occasion? Or square root of negative numbers? I'm
> > asking because, while this needs to be addressed (and so
> > far the discussion is very revealing,) it might save you time
> > if a workaround can be found.
> > 
> 
> I have simple checks to avoid division by zero, taking the log of a 
> negative, etc., but if you mix a bunch of random mathmatical functions 
> with a bunch of random values, you're going to get some strange results 
> sometimes.  The checks I have are all for *before* a function is 
> performed.  For instance, if the second argument is zero in a division, 
> don't do the calculation.  This will avoid an outright crash.  Other 
> functions, like tan(), will output nan or -nan if the value going in is 
> too extreme.  Since it doesn't actually crash, it would be much easier 
> to check for a nan after the function is performed then try to set 
> strict limits that must be checked before each individual function is 
> performed.  If I can check for nans reliably, I can just set up a custom 
> 
> "non_nan" type that catches it (a type that always returns TRUE to avoid 
> 
> a crash, but sets another global flag so I can throw out that function 
> internally)...
> 
> 

I still don't understand what is wrong with equal(x,nan)


Chris

new topic     » goto parent     » topic index » view message » categorize

24. RE: Uninitialized Variables

> 
> I still don't understand what is wrong with equal(x,nan)
> 
> 

Simply, it doesn't work on my system.  If it works on yours, then that's 
a double-reason not to use it, as clearly it is unpredictable.  The 
other thread my have solved my problem, though -- sprint(nan) returns 
"nan"!

new topic     » goto parent     » topic index » view message » categorize

25. RE: Uninitialized Variables

jbrown1050 at yahoo.com wrote:
> On  0, Andy Serpa <renegade at earthling.net> wrote:
> > 
> > 
> > > I still don't understand what is wrong with
> equal(x,nan)
> > > 
> > > 
> > Simply, it doesn't work on my system.  If it works
> on yours, then that's 
> > a double-reason not to use it, as clearly it is
> unpredictable.  The 
> > other thread my have solved my problem, though --
> sprint(nan) returns 
> > "nan"!
> > 
> 

Turns out sprint() is way slow.  Here's my solution for now to detect 
inf's or nan's, which are effectively the same for my purposes:

constant inf = 1e300 * 1e300
constant nan = -(inf/inf)
constant inf_s = atom_to_float32(inf)
constant inf_neg_s = atom_to_float32(-inf)
constant nan_s = atom_to_float32(nan)
constant nan_neg_s = atom_to_float32(-nan)
constant bad_things = {inf_s, inf_neg_s, nan_s, nan_neg_s}

type nan_or_inf(atom x)
sequence x_seq
  x_seq = atom_to_float32(x)
  if find(x_seq, bad_things) then
    return 1
  else
    return 0
  end if
end type

Then, when I need to check, I just:

if nan_or_inf(x) then...

new topic     » goto parent     » topic index » view message » categorize

26. RE: Uninitialized Variables

jbrown1050 at yahoo.com wrote:
> On  0, Andy Serpa <renegade at earthling.net> wrote:
> > 
> > Turns out sprint() is way slow.  Here's my solution
> for now to detect 
> > inf's or nan's, which are effectively the same for
> my purposes:
> > 
> > constant inf = 1e300 * 1e300
> > constant nan = -(inf/inf)
> > constant inf_s = atom_to_float32(inf)
> > constant inf_neg_s = atom_to_float32(-inf)
> > constant nan_s = atom_to_float32(nan)
> > constant nan_neg_s = atom_to_float32(-nan)
> > constant bad_things = {inf_s, inf_neg_s, nan_s,
> nan_neg_s}
> > 
> > type nan_or_inf(atom x)
> > sequence x_seq
> >   x_seq = atom_to_float32(x)
> >   if find(x_seq, bad_things) then
> >     return 1
> >   else
> >     return 0
> >   end if
> > end type
> > 
> > Then, when I need to check, I just:
> > 
> > if nan_or_inf(x) then... 
> > 
> 
> You know, equal(x, inf) works fine for me. WHy not
> just have bad_things
> contain the nans only, and have an "is_nan" type?
> 
> And if you really need it, why not have a seperate
> is_inf type? That would
> allow you to distingush them.
> 
> I'm just wondering why you set it up this way, thats
> all.
> 

Yeah, that would work too.  I need to detect for either one of them, so 
I combined them.  If equal works with inf that is probably faster, 
you're right...

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu