I agree with bill lam.

And why this is might be worth going over for people not comfortable
reading J's source code.

Here's the code being modified:

static void jtfmt1(J jt,B e,I m,I d,C*s,I t,C*wv){D y;
 switch(t){
  case B01:  sprintf(jt->th2buf,s,(D)*wv);     break;
  case INT:  sprintf(jt->th2buf,s,(D)*(I*)wv); break;
  case XNUM: fmtx(e,m,d,s,t,(X*)wv);          break;
  case RAT:  fmtq(e,m,d,s,t,(Q*)wv);          break;
  default:
   y=*(D*)wv; y=y?y:0.0;  /* -0 to 0 */
   if     (!memcmp(wv,&inf, SZD))strcpy(jt->th2buf,e?"  _" :' '==*s?" _" :"_" );
   else if(!memcmp(wv,&infm,SZD))strcpy(jt->th2buf,e?" __" :' '==*s?" __":"__");
   else if(_isnan((float) *wv)  )strcpy(jt->th2buf,e?"  _.":' '==*s?" _.":"_.");
   else sprintf(jt->th2buf,s,y);
}}   /* format one number */

And the change changes:
   else if(_isnan(*wv)  )strcpy(jt->th2buf,e?"  _.":' '==*s?" _.":"_.");

to
   else if(_isnan((float) *wv)  )strcpy(jt->th2buf,e?"  _.":' '==*s?" _.":"_.");



But
(1) J uses the (double) data type rather than the (float) data type.
https://github.com/jsoftware/jsource/blob/master/jsrc/jtype.h#L37

(2) the (wv) variable type is a pointer to character (because the code
was written based on documentation which was written before pointer to
void became popular for handling this kind of issue).
https://github.com/paspanag/jsource/blob/b4c69a3887a7586a3282cdbdbad34f0fa84aef68/jsrc/f2.c#L132

And, in fact, if you look at line 139, you see the *(D*)wv pattern
being used to first transform the wv pointer into a pointer to a
double and then to find the value being pointed at.

That said, line 139 looks like this:
   y=*(D*)wv; y=y?y:0.0;  /* -0 to 0 */

and so it's tempting to think that maybe we should just use (y)
instead of spelling out (*(D*)wv) again.

But there's also the worry about y having been reassigned.
Conceptually speaking, a NaN value is not a negative zero value or any
kind of zero value. But people like to argue all the time, and NaN
values are mathematical nonsense so you never know what is valid about
them. See, for example:
http://stackoverflow.com/questions/9158567/nan-to-bool-conversion-true-or-false

There, some people reason that NaN values are true values while others
quite rightly retort that NaN values are not true values.

Anyways, you never know what changes people will be trying to make and
for something nonsensical like NaN it pays to be a little cautious.

So, anyways, the patch here would get a character value from the
"first" byte of the number being tested and then transform that to a
float value before testing whether the value was an IEEE 754 floating
point representation of a "Not a Number" value. And since characters
are never NaN values (they are instead values in the range -128 ..
127) I think this change would have made it so that we would not see
_. when formatting numbers.

(But I have not actually tested code with that change, to know exactly
what would have happened when trying to format a NaN value. J mostly
prevents those values from existing in the first place, because they
are nonsense, but there are a few ways to get them to exist.)

Anyways, I saw this and I thought that maybe I should go through the
kind of thinking you might infer from what bill was suggesting.

Thanks,

-- 
Raul



On Sun, Jun 12, 2016 at 6:46 AM, bill lam <bbill....@gmail.com> wrote:
> I think the proper fix should be
> *(D*)wv
> ---------- Forwarded message ----------
> From: "Peter Panaguiton" <notificati...@github.com>
> Date: Jun 10, 2016 4:38 AM
> Subject: [jsoftware/jsource] gcc complaining about type for _isnan. (#1)
> To: "jsoftware/jsource" <jsou...@noreply.github.com>
> Cc:
>
> Trying to packge the j git version as the current version in the Nixos
>> packages is broken. Built it with this as the only error stopping it from
>> being built with Nixos's current gcc (gcc 5.3 and glibc 2.23).
>> ------------------------------
>> You can view, comment on, or merge this pull request online at:
>>
>>   https://github.com/jsoftware/jsource/pull/1
>> Commit Summary
>>
>>    - gcc complaining about type for _isnan.
>>
>> File Changes
>>
>>    - *M* jsrc/f2.c
>>    <https://github.com/jsoftware/jsource/pull/1/files#diff-0> (2)
>>
>> Patch Links:
>>
>>    - https://github.com/jsoftware/jsource/pull/1.patch
>>    - https://github.com/jsoftware/jsource/pull/1.diff
>>
>> —
>> You are receiving this because you are subscribed to this thread.
>> Reply to this email directly, view it on GitHub
>> <https://github.com/jsoftware/jsource/pull/1>, or mute the thread
>> <https://github.com/notifications/unsubscribe/ABg1YZJ46q9zqI5yvmNYjfcv-3n59I36ks5qKHmtgaJpZM4IyYR7>
>> .
>>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to