That's a good point. Thinking about that side of things: something else must be dealing with that.
I suppose I should trace things out to see where that is happening. (I am not sure if Marshall Lochbaum's comment "I fixed it in unbox a while ago" is a parallel fix or is a reference to the actual code which is responsible for the correct behavior of jtfmt1() for NaN despite this if statement not doing anything in its current form. Probably just a parallel fix...) Thanks, -- Raul On Sun, Jun 12, 2016 at 8:43 AM, bill lam <bbill....@gmail.com> wrote: > I am quite puzzled why the original code still works without any patch. eg, > > 8!:0] 3.4 1 _. > +---+-+--+ > |3.4|1|_.| > +---+-+--+ > On Jun 12, 2016 8:06 PM, "Raul Miller" <rauldmil...@gmail.com> wrote: > >> 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 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm