Dear Juergen,

Thank you very much for your explanation.  Whatever you did, it certainly
fixed the problem.  I am sure as time goes on there will be optimizations.
 As far as I can tell, the system is working really great.

Thanks!

Blake



On Wed, Jun 11, 2014 at 11:58 AM, Juergen Sauermann <
juergen.sauerm...@t-online.de> wrote:

>  Hi Blake,
>
> GNU APL normally chooses the generic way. The reason is simple: there are
> 3x3 = 9 combinations of INT REAL and COMPLEX arguments
> of a dyadic functions (or 3×3×3=27 if you also count the axis). With 24 or
> so scalar functions this would give more than 200 cases
> - too much for a lazy guy like me.
>
> Another problem is that real arithmetic can lead to complex results, eg.
> ¯1⋆.5.
>
> What GNU APL does is checking of the result type (INT, REAL, or COMPLEX)
> rather than the argument types,
> and to demote complex near-real results to real and real near-int values
> to int.
>
> Contrary to your opinion below, the most generic number type in GNU APL is
> not *double* but *complex<double>*.
> And that causes the failure that was fixed in SVN 219. The internal 0J0
> result was not properly recognized as near-real, so it was left as is.
>
> Type specific functions are only used if:
>
> 1. they have considerably better performance than a generic variant, and
> 2. they are frequently used with large arguments
>
> That was not the case for Encode.
>
> So the clear integer 0 was 0J0 (to be generic) and was not converted back
> to 0 by mistake.
>
> There is a serious problem with ⎕CT as such. ⎕CT is 1E¯13 by default but
> our numbers can be as small
> as 1E¯308. So we cannot simply set everything small (say < 1E¯13) to 0, or
> make complex numbers with small
> imaginary parts real, because we would loose precision when doing so. The
> strategy of GNU APL is to keep
> internal precision as long as possible and to demote only if absolutely
> necessary. This decision is on a per-primitive
> base. Encode was actually demoted, except that demotion of 0J0 did not
> result in integer 0.
>
> I would also say that your rules below are implemented in GNU APL to the
> extent that they are correct.
> They are not, though, since Integer + Integer can be double if the maximum
> integer is exceeded (and so on...).
>
> /// Jürgen
>
>
>
> On 06/11/2014 05:52 PM, Blake McBride wrote:
>
> Thanks a lot, Juergen!  Disconnected from the standard, I fail to see how
> a clear integer can become a complex - especially in relation to
> code/decode.  I think there is something fundamentally wrong.
>
>  I make the following comments just based on my own experience with
> numbers, and without experience with the GNU APL code.  I also think it is
> highly likely you know a lot more about this than I.  I just wanted to
> share, a perhaps ignorant, opinion.  I apologize in advanced.
>
>  Numbers have various representations including integer, floating point,
> and complex.  There are two ways (for the purposes of this commentary) of
> performing calculations as follows:
>
>  1.  Remember the exact type and perform the calculation based on the
> type or circumstances, i.e.
>
>  switch (number type) {
> case INTEGER:  int_res = int_x + int_y;  break;
> case: FLOAT:  float_res = float_x + float_y; break;
> case: COMPLEX: complex_res = complex_x + complex_y; break;
> }
>
>
>  2.  Do it generically:
>
>  res = x + y;
>
>  In other words, in all places in a C program, one can define all numbers
> to be double (generic math), and do all calculations on doubles.  The
> problem, of course, is the unfixable rounding errors in cases when only
> needing integer calculations.
>
>  It is a lot more work to remember the data types and keep the math at
> the simplest level than to generalize it as all just math in too broad a
> generic way.
>
>  Irrespective of any "standards", I fail to see operating on integers in
> an integer-only way can bypass reals and become complex numbers.  It seems
> like the math is being done way too generically.  If that is true, there is
> ultimately no  ⎕CT tweaking that will ever reliably fix the problem.
>
>  I think the system should incorporate rules.  Things like:
>
>  a.  integer plus/minus/times integer always equals integer
>
>  b.  integer divided by integer produces float but never complex
>
>  c.  float plus/minus/times/divide float/integer produced float and never
> complex
>
>  d.  etc.
>
>  It is not possible for ⎕CT to substitute for rules like these.  ⎕CT can
> only be used to minimize problems but never to eliminate them.  Although,
> there are many situations where there is utterly no fix, utilizing rules
> like these makes the system easy for the programmer to deal with - i.e. he
> knows when he's created a problem (like using division).
>
>  Just for grins, I tried the problem on IBM APL 2.  It had no problem
> with 200.  Is there a ⎕CT test I can do to determine if they are involving
> ⎕CT?
>
>  One serious fear is that APL uses 0 to represent false.  Conditional
> statements control the flow of a program.  What happens if we cannot rely
> on zero being zero?
>
>  With deep respect and appreciation for what you have done,
>
>  Blake
>
>
>
>  On Wed, Jun 11, 2014 at 7:54 AM, Juergen Sauermann <
> juergen.sauerm...@t-online.de> wrote:
>
>>  Hi,
>>
>> I have changed the code so that near-zero complex numbers in ⊤ are
>> demoted to integer 0, see SVN 319. This isn't quite in line with the
>> standard
>> who says that ⎕CT is not used in ⊤, but makes more sense to me.
>>
>> /// Jürgen
>>
>>
>>
>

Reply via email to