make native ⌾(is⊸⊏) & ⌾(m⊸/) compare NaNs as equal

This commit is contained in:
dzaima 2025-05-20 23:14:58 +03:00
parent d67e587acf
commit 723ca38816
4 changed files with 24 additions and 16 deletions

View File

@ -480,14 +480,14 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu
for (usz i = 0; i < wia; i++) {
READ_W(cw, i);
B cn = Get(rep, i);
EQ1(!equal(mut_getU(r, cw), cn));
EQ1(!compatible(mut_getU(r, cw), cn));
mut_rm(r, cw);
mut_setG(r, cw, cn);
}
} else {
for (usz i = 0; i < wia; i++) {
READ_W(cw, i);
EQ(for (usz j = 0; j < csz; j++), !equal(mut_getU(r, cw*csz + j), Get(rep, i*csz + j)));
EQ(for (usz j = 0; j < csz; j++), !compatible(mut_getU(r, cw*csz + j), Get(rep, i*csz + j)));
for (usz j = 0; j < csz; j++) mut_rm(r, cw*csz + j);
mut_copyG(r, cw*csz, rep, i*csz, csz);
}
@ -538,14 +538,14 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu
for (usz i = 0; i < wia; i++) {
READ_W(cw, i);
B cn = Get(rep, i);
EQ1(!equal(cn,rp[cw]));
EQ1(!compatible(cn,rp[cw]));
dec(rp[cw]);
rp[cw] = cn;
}
} else {
for (usz i = 0; i < wia; i++) {
READ_W(cw, i);
EQ(for (usz j = 0; j < csz; j++), !equal(Get(rep, i*csz + j), rp[cw*csz + j]));
EQ(for (usz j = 0; j < csz; j++), !compatible(Get(rep, i*csz + j), rp[cw*csz + j]));
for (usz j = 0; j < csz; j++) dec(rp[cw*csz + j]);
COPY_TO(rp, el_B, cw*csz, rep, i*csz, csz);
}
@ -554,23 +554,25 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu
}
}
#define IMPL(T) do { \
#define IMPL(T, COMPATIBLE) do { \
if (csz!=1) goto do_tycell; \
T* rp = tyarrv_ptr((TyArr*)ra); \
T* np = tyany_ptr(rep); \
for (usz i = 0; i < wia; i++) { \
READ_W(cw, i); \
T cn = np[i]; \
EQ1(cn != rp[cw]); \
EQ1(!COMPATIBLE(cn, rp[cw])); \
rp[cw] = cn; \
} \
goto dec_ret_ra; \
} while(0)
do_u8: IMPL(u8);
do_u16: IMPL(u16);
do_u32: IMPL(u32);
do_f64: IMPL(f64);
#define INT_EQ(A,B) ((A)==(B))
do_u8: IMPL(u8, INT_EQ);
do_u16: IMPL(u16, INT_EQ);
do_u32: IMPL(u32, INT_EQ);
do_f64: IMPL(f64, compatibleFloats);
#undef INT_EQ
#undef IMPL
do_tycell:;

View File

@ -1175,7 +1175,7 @@ B slash_ucw(B t, B o, B w, B x) {
i32 cw = o2iG(GetU(w, i));
if (cw) {
B cr = Get(rep,repI);
if (CHECK_VALID) for (i32 j = 1; j < cw; j++) if (!equal(GetU(rep,repI+j), cr)) { mut_pfree(r,i); thrM("𝔽⌾(a⊸/): Incompatible result elements"); }
if (CHECK_VALID) for (i32 j = 1; j < cw; j++) if (!compatible(GetU(rep,repI+j), cr)) { mut_pfree(r,i); thrM("𝔽⌾(a⊸/): Incompatible result elements"); }
mut_setG(r, i, cr);
repI+= cw;
} else mut_setG(r, i, Get(x,i));

View File

@ -338,6 +338,12 @@ static bool atomEqual(B w, B x) { // doesn't consume
if (!isVal(w) | !isVal(x)) return false;
return atomEqualF(w, x);
}
static bool compatible(B w, B x) {
return eequal(w, x);
}
static bool compatibleFloats(f64 a, f64 b) {
return a==b || (a!=a && b!=b);
}
NOINLINE usz depthF(B x);
static usz depth(B x) { // doesn't consume

View File

@ -111,7 +111,7 @@ n←500 ⋄ a←↕n ⋄ i←(-n)+↕2×n ⋄ r←⌽(2×n)⥊a ⋄ ! (⌽a) ≡
%USE eqvar 1+((2/5)) _eqvar ˘ 10 %% ˘ <5+ 10
%USE eqvar •internal.Keep((2/5)) _eqvar 10040 %% 10040
%USE eqvar (<) {•internal.Keep(𝕨) 𝕩}_eqvar¨ 01, "ab""cd" %% 01, "ab""cd"
!"𝔽⌾(a⊸⊏): Incompatible result elements" % %USE evar 0÷0,0÷0 {𝕨(00) 𝕩}_evar 30
%USE eqvar 0÷0,0÷0 {𝕨(00) 𝕩}_eqvar 30 %% 0÷0,0,0
%USE eqvar %USE nz 00 {(0 InsNZ 20)(𝕨)𝕩}_eqvar 33 %% 033
@ -248,12 +248,12 @@ n←500 ⋄ a←↕n ⋄ i←(-n)+↕2×n ⋄ r←⌽(2×n)⥊a ⋄ ! (⌽a) ≡
! •Show "I should not be called!"
}
Batch¨
00, 11, 0÷0
00, 11, <0÷0
00, 11, 3,0÷0,4
11, 11, 0÷0
11, 11, <0÷0
11, 11, 3,0÷0,4
11, 11, {𝕊: ShouldNotBeCalled}
11, 11, ShouldNotBeCalled˙
01, 01, {𝕊: ShouldNotBeCalled(0÷0)}
11, 01, {𝕊: ShouldNotBeCalled(0÷0)}
11, 11, ShouldNotBeCalled(0÷0)˙
11, 11,