I remember that comparisons with 0 are exact
0 = N - N + epsilon
0 0 0 0 0 0 0 1 1
which agrees with your first report. No, I am unfamiliar with the IEEE
structure, and am surprised by these results.
--Kip
Sent from my iPad
On Feb 28, 2013, at 4:21 PM, Raul Miller <[email protected]> wrote:
> Are you familiar with the structure of IEEE 754 floating point numbers?
>
> Consider, for example:
>
> epsilon=: 2^_44
> N=: 10^i:4
>
> NB. this result reflects IEEE-754's structure
> *N+epsilon-N
> 1 1 1 1 1 1 1 0 0
>
> NB. this result reflects J's heuristic to deal with that structure
> N=N+epsilon
> 0 0 0 0 1 1 1 1 1
>
> FYI,
>
> --
> Raul
>
> On Thu, Feb 28, 2013 at 4:28 PM, km <[email protected]> wrote:
>> Here is what I did
>>
>> NB. right hand limit of a function
>>
>> lim =: 1 : 0
>> value =. u y + (2^_44)
>> if. value <: - 2^40 do. __
>> elseif. value >: 2^40 do. _
>> elseif. do. value
>> end.
>> )
>>
>> It does "reasonably well" but can be fooled, for example
>>
>> ] lim 2^40
>> _
>>
>> Here it does better
>>
>> *: lim 1000
>> 1000000
>>
>> dq =: 1 : (':'; 'y %~ (u x+y) - u x') NB. difference quotient
>>
>> 2&(^&3 dq)lim 0 NB. derivative of x^3 at 2 is 12
>> 12
>>
>> --Kip
>>
>> Sent from my iPad
>>
>>
>> On Feb 28, 2013, at 7:19 AM, Raul Miller <[email protected]> wrote:
>>
>>> Here's a model implementation:
>>>
>>> lim=: (1 :0)("0)
>>> tests=. u ((1e_6*1>.|y)*0.5^i.1000)+y
>>> tests {~{.I.((1 }. 0&~:) * 2 ~:/\ ])(,2:)(*!.0)2 -/\ tests
>>> )
>>>
>>> My assumptions are:
>>>
>>> (1) the limit in question is relatively stable (that my choices for
>>> epsilon are adequate)
>>>
>>> (2) that the result of limit should be a consistent number.
>>>
>>> Note that (2) means that _ and __ will typically not be returned,
>>> since they are inconsistent numbers (but, since they are inconsistent,
>>> it's impossible to make an entirely consistent guarantee about their
>>> treatment).
>>>
>>> (1&o.%]) lim 0
>>> 1
>>> % lim 0
>>> 2.67877e306
>>> -@% lim 0
>>> _2.67877e306
>>>
>>> For my purposes, these "e306" values are close enough to infinity to
>>> be treated as such.
>>>
>>> Note also that I'm probably being a bit too aggressive with the number
>>> of epsilon values I'm using.
>>>
>>> If you really want _ and __ results, you could use something like this:
>>>
>>> lim=: (1 :0)("0)
>>> tests=. u ((1e_6*1>.|y)*0.5^i.1000)+y
>>> 1e_3*1e3* tests {~{.I.((1 }. 0&~:) * 2 ~:/\ ])(,2:)(*!.0)2 -/\ tests
>>> )
>>>
>>> However, note that this is a heuristic and its ability to force the
>>> result to be an inconsistent infinity depends on the stability u (and
>>> also depends on the actual limit value). I place less faith in this
>>> mechanism than in the ability of the user to recognize that the result
>>> should be thought of as infinite (and if the user does not understand
>>> what's going on well enough to make that determination it's hard to
>>> imagine how this distinction could be useful).
>>>
>>> FYI,
>>>
>>> --
>>> Raul
>>>
>>> On Wed, Feb 27, 2013 at 10:55 PM, km <[email protected]> wrote:
>>>> Can you write an adverb lim so that
>>>>
>>>> sin =: 1&o.
>>>>
>>>> (sin % ])lim 0
>>>> 1
>>>>
>>>> % lim 0 NB. limit is from right
>>>> _
>>>>
>>>> -@% lim 0
>>>> __
>>>>
>>>>
>>>> Kip Murray
>>>>
>>>> Sent from my iPad
>>>>
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm