use Ryu for number formatting for %f

This commit is contained in:
dzaima 2025-07-25 11:20:54 +03:00
parent ca9d76c9a6
commit 339bc8ced6
4 changed files with 19 additions and 5 deletions

View File

@ -206,6 +206,9 @@ i32 num_fmt(char buf[30], f64 x) {
return len; return len;
} }
#if !NO_RYU
B ryu_d2s(double f);
#endif
static B appendRaw(B s, B x) { assert(isArr(x) && RNK(x)==1); // consumes x static B appendRaw(B s, B x) { assert(isArr(x) && RNK(x)==1); // consumes x
AJOIN(squeeze_chrOut(x)); AJOIN(squeeze_chrOut(x));
return s; return s;
@ -315,8 +318,13 @@ NOINLINE B do_fmt(B s, char* p, va_list a) {
break; break;
} }
case 'f': { case 'f': {
NUM_FMT_BUF(buf, va_arg(a, f64)); f64 val = va_arg(a, f64);
#if NO_RYU
NUM_FMT_BUF(buf, val);
AU(buf); AU(buf);
#else
AJOIN(ryu_d2s(val));
#endif
break; break;
} }
case 'c': { case 'c': {

View File

@ -407,6 +407,12 @@ b←1↓1∾a←"hello" ⋄ b ⌽⎊'e' ⥊⟜1⍟2 5 ⋄ a ≡○•Hash b %% 1
!"↕𝕩: 𝕩 must be either an integer or integer list (had rank 2)" % 221 !"↕𝕩: 𝕩 must be either an integer or integer list (had rank 2)" % 221
!"↕𝕩: Result rank too large (300≡≠𝕩)" % 3001 !"↕𝕩: Result rank too large (300≡≠𝕩)" % 3001
!"↕𝕩: Result too large" % 2010 !"↕𝕩: Result too large" % 2010
!"Expected non-negative integer, got 3000.0000000000005" % 1e4×1.3-1
!"Expected non-negative integer, got ¯3000.0000000000005" % -1e4×1.3-1
!"Expected non-negative integer, got ¯10000" % -1e4
!"Out of memory" % 2e9 %USZ32
!"Out of memory" % 1e18 %USZ64
!"Integer out of range: 1e20" % 1e20
%% <0 %% <0
100 %% 100 100 %% 100
10 %% ¨ 10 10 %% ¨ 10

View File

@ -328,8 +328,8 @@ r←•MakeRand 1 ⋄ ! 1¨⊸≡ ∊{𝕊: 500 r.Deal 1000}¨ ↕4
!"•bit._cast: unsupported width 1073741824" % (2230)•bit._cast 0 !"•bit._cast: unsupported width 1073741824" % (2230)•bit._cast 0
!"•bit._cast: unsupported width 1125899906842624" % (2250)•bit._cast 0 %USZ64 !"•bit._cast: unsupported width 1125899906842624" % (2250)•bit._cast 0 %USZ64
!"Integer out of range: 1125899906842624" % (2250)•bit._cast 0 %USZ32 !"Integer out of range: 1.125899906842624e15" % (2250)•bit._cast 0 %USZ32
!"Integer out of range: 1.180591620717411e21" % (2270)•bit._cast 0 !"Integer out of range: 1.1805916207174113e21" % (2270)•bit._cast 0
!"Integer out of range: ∞" % (2)•bit._cast 0 !"Integer out of range: ∞" % (2)•bit._cast 0
!"•bit._cast: unsupported width 12" % 112•bit._cast 110 !"•bit._cast: unsupported width 12" % 112•bit._cast 110

View File

@ -177,7 +177,7 @@ n←500 ⋄ a←↕n ⋄ i←(-n)+↕2×n ⋄ r←⌽(2×n)⥊a ⋄ ! (⌽a) ≡
%USE eqvar <> {𝕨(10011/) 𝕩}_eqvar +-×÷ %% <-×> %USE eqvar <> {𝕨(10011/) 𝕩}_eqvar +-×÷ %% <-×>
%USE eqvar ["wx""WX","yz""YZ"] {𝕨(1001/) 𝕩}_eqvar (<"aA")+42 %% 42"wx","WX","bA","bB","cA","cB","yz","YZ" %USE eqvar ["wx""WX","yz""YZ"] {𝕨(1001/) 𝕩}_eqvar (<"aA")+42 %% 42"wx","WX","bA","bB","cA","cB","yz","YZ"
{m𝕩•rand.Range 2 ! (m{𝕨?"huh";'a'+𝕩}¨𝕩) "huh"¨(m/) 'a'+𝕩}¨ 100 {m𝕩•rand.Range 2 ! (m{𝕨?"huh";'a'+𝕩}¨𝕩) "huh"¨(m/) 'a'+𝕩}¨ 100
!"Integer out of range: 3.68934881474191e19" % 1¨(a/) a100265 !"Integer out of range: 3.6893488147419103e19" % 1¨(a/) a100265
!"Expected non-negative integer, got ¯10" % %USE evar 1¨(a/)_evar a¯10(50) 10010 !"Expected non-negative integer, got ¯10" % %USE evar 1¨(a/)_evar a¯10(50) 10010
# ↓ & ↑ # ↓ & ↑