Many thanks to Raul, Henry, and Oleg.

I should have realised with a discrepancy this large it had to be caused by
a bug.

Ronan


On 28/06/2006 07:48, "Oleg Kobchenko" <[EMAIL PROTECTED]> wrote:

>    0j6": +/ (* 1&<) *:-. (|. v1) p. (%~ i:) 30
> 676667.956501
> 
> 
> ----- Original Message ----
> From: Henry Rich <[EMAIL PROTECTED]>
> To: Programming forum <[email protected]>
> Sent: Tuesday, June 27, 2006 9:56:31 PM
> Subject: RE: [Jprogramming] Precision query
> 
> 
> You need to do the 1-px thing like so:
> 
> calcCost =: [: +/ [: *: -. * _1&> + 1&<
> 
> and then, if you want to see the result in full precision,
> you have to ask for it:
> 
>    15j6 ": calcCost (|. v1) p. dxVect
>   676667.956501
> 
> The default display doesn't show the lower digits.
> 
> 
> It doesn't seem right to me to look for values outside
> of [0,1] and then square the distance from 1.  Shouldn't
> you square the distance from 1 if it's >1, and square
> the distance from _1 if it's <_1?  That is,
> 
> -.@:|  instead of   -.   above
> 
> Henry Rich
> 
>> -----Original Message-----
>> From: [EMAIL PROTECTED]
>> [mailto:[EMAIL PROTECTED] On Behalf Of Ronan Reilly
>> Sent: Tuesday, June 27, 2006 8:17 PM
>> To: Programming forum
>> Subject: [Jprogramming] Precision query
>> 
>> Hi,
>> 
>> In light of the recent discussion on precision and rounding
>> error, I have a
>> concrete example of a problem I'm having with rounding error (at least
>> that's where I think the problem lies).
>> 
>> The goal is to write a cost function for a polynomial
>> evaluation so that any
>> result outside [-1,1] is penalised.  The work is part of an
>> implementation
>> of a genetic algorithm.
>> 
>> Here is a stripped down C function which I'm using as the
>> basis for my J
>> implementation (plus a sample vector for evaluation):
>> ====
>> #include "stdio.h"
>> 
>> double evaluate (int, double[]);
>> 
>> int main() {
>> 
>>   double v1[]={54.735, 31.069, -79.616, -22.279, -76.028,
>> -42.021, -34.925,
>> -44.066, -53.706};
>>   printf ("evaluate: %f\n", evaluate(9, v1));
>> 
>>   return;
>> }
>> 
>> double evaluate(int D, double tmp[]) {
>>     int const M=60;
>>     int i, j;
>>     double px, x, dx, result=0.0;
>> 
>>     x = -1.0;
>>     dx = 2.0/(double)M;
>>     for (i=0; i<=M; i++) {
>>         px = tmp[0];
>>         for (j=1; j<D; j++) {
>>             px = x*px + tmp[j];
>>         }
>>         if (px<-1.0 || px>1.0) result+=(1.0-px)*(1.0-px);
>>         x+=dx;
>>     }
>>     return result;
>> }
>> ===
>> 
>> Here is the equivalent J code:
>> 
>> v1 =: 54.735 31.069 _79.616 _22.279 _76.028 _42.021 _34.925
>> _44.066 _53.706
>> dxVect =: +/\ _1, 60 $ 2 % 60
>> calcCost =: [: +/ [: *: ] * _1&> + 1&<
>> 
>> When I run the J code (J601 o beta) I get:
>> 
>>     calcCost (|. v1) p. dxVect
>> 665922
>> 
>> whereas running the C program gives me:
>> 
>> evaluate: 676667.956501
>> 
>> The problem seems to be with calcCost, and I was wondering if
>> there was a
>> different way of formulating that function to reduce the
>> discrepancy in the
>> two results.
>> 
>> Many thanks,
>> 
>> Ronan
>> 
>> 
>> --
>> Ronan Reilly
>> NUI Maynooth
>> 
>> t: +353-1-7083847
>> e: [EMAIL PROTECTED]
>> w: http://www.cs.nuim.ie; http://cortex.cs.nuim.ie
>> 
>> 
>> 
>> ----------------------------------------------------------------------
>> 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
> 

--
Professor Ronan Reilly
Head of Department
Department of Computer Science
NUI Maynooth
Maynooth
Co. Kildare
IRELAND

t: +353-1-7083847
e: [EMAIL PROTECTED]
w: http://www.cs.nuim.ie; http://cortex.cs.nuim.ie



----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to