{"name":"math_basic.nu","source":"// Test: stdlib/std/float.nu + stdlib/std/int.nu\n//\n// Covers the libm wrappers (sqrt/sin/cos/log/exp/pow/floor/ceil/round),\n// integer abs/pow/sign, NaN/Inf predicates, and the strict float parser.\n// Float results are rounded to integers (or compared by sign / threshold)\n// to keep stdout byte-deterministic across libm implementations.\n\n$ `stdlib/core/errors.nu`\n$ `stdlib/std/float.nu`\n$ `stdlib/std/int.nu`\n\n@ pi i n s label → v {\n    ( nurl_print label ) ( nurl_print `=` )\n    ( nurl_print ( nurl_str_int n ) ) ( nurl_print `\\n` )\n}\n\n@ pb b v s label → v {\n    ( nurl_print label ) ( nurl_print `=` )\n    ( nurl_print ? v `T` `F` ) ( nurl_print `\\n` )\n}\n\n@ main → i {\n    // ── Integer helpers ────────────────────────────────────\n    ( pi ( int_abs -7 ) `int_abs(-7)` )\n    ( pi ( int_abs 5 ) `int_abs(5)` )\n    ( pi ( int_pow 2 10 ) `int_pow(2,10)` )\n    ( pi ( int_pow 3 4 ) `int_pow(3,4)` )\n    ( pi ( int_pow 5 0 ) `int_pow(5,0)` )  // anything^0 = 1\n    ( pi ( int_pow 7 -2 ) `int_pow(7,-2)` )  // negative y → 0\n    ( pi ( int_sign -42 ) `int_sign(-42)` )\n    ( pi ( int_sign 0 ) `int_sign(0)` )\n    ( pi ( int_sign 99 ) `int_sign(99)` )\n    ( pi INT_MAX `INT_MAX` )\n    ( pi ( int_min_val ) `INT_MIN` )\n\n    // ── Float wrappers — rounded to int for portability ────\n    ( pi # i ( float_sqrt 16.0 ) `sqrt(16)` )  // 4\n    ( pi # i ( float_sqrt 2.0 ) `sqrt(2)_t` )  // 1 (truncates)\n    ( pi # i ( float_floor 3.7 ) `floor(3.7)` )  // 3\n    ( pi # i ( float_ceil 3.2 ) `ceil(3.2)` )  // 4\n    ( pi # i ( float_round 2.5 ) `round(2.5)` )  // 3 (away-zero)\n    ( pi # i ( float_round -2.5 ) `round(-2.5)` )  // -3\n    ( pi # i ( float_abs -8.5 ) `abs(-8.5)_t` )  // 8 (truncates)\n    ( pi # i ( float_pow 2.0 8.0 ) `pow(2,8)` )  // 256\n    ( pi # i ( float_pow 4.0 0.5 ) `pow(4,0.5)` )  // 2  (sqrt via pow)\n    ( pi # i ( float_exp 0.0 ) `exp(0)` )  // 1\n    ( pi # i ( float_log 1.0 ) `log(1)` )  // 0\n\n    // sin(0)=0, cos(0)=1, tan(0)=0\n    ( pi # i ( float_sin 0.0 ) `sin(0)` )\n    ( pi # i ( float_cos 0.0 ) `cos(0)` )\n    ( pi # i ( float_tan 0.0 ) `tan(0)` )\n\n    // sin(π/2) ≈ 1, cos(π) ≈ -1\n    ( pi # i ( float_round ( float_sin PI_2 ) ) `sin(π/2)` )  // 1\n    ( pi # i ( float_round ( float_cos PI ) ) `cos(π)` )  // -1\n\n    // atan2(1,0) = π/2 ; atan2(0,-1) = π\n    ( pi # i ( float_round ( float_atan2 1.0 0.0 ) ) `atan2(1,0)_r` )  // 2 (round 1.5708)\n    ( pi # i ( float_round ( float_atan2 0.0 -1.0 ) ) `atan2(0,-1)_r` )  // 3 (round π=3.14159)\n\n    // log(e) = 1\n    ( pi # i ( float_log E ) `log(e)` )\n\n    // ── Predicates ────────────────────────────────────────\n    // 0/0-style NaN via log(-1).\n    ( pb ( float_is_nan ( float_log -1.0 ) ) `is_nan(log(-1))` )\n    ( pb ( float_is_nan 1.0 ) `is_nan(1)` )\n    // exp(1000) overflows to +Inf in IEEE-754 doubles.\n    ( pb ( float_is_inf ( float_exp 1000.0 ) ) `is_inf(exp1000)` )\n    ( pb ( float_is_inf 1.0 ) `is_inf(1)` )\n\n    // ── float_parse strict ────────────────────────────────\n    : !f ParseErr p1 ( float_parse `3.14` )\n    ?? p1 {\n        T x → { ( pi # i x `parse(3.14)_t` ) }  // 3 (truncates)\n        F e → { ( nurl_print `parse(3.14)_err\\n` ) }\n    }\n    : !f ParseErr p2 ( float_parse `` )\n    ?? p2 {\n        T x → { ( nurl_print `parse(empty)_unexpected_ok\\n` ) }\n        F e → { ( nurl_print `parse(empty)=` )\n            ( nurl_print ( parse_err_msg # ParseErr e ) )\n            ( nurl_print `\\n` ) }\n    }\n    : !f ParseErr p3 ( float_parse `1.5xyz` )\n    ?? p3 {\n        T x → { ( nurl_print `parse(garbage)_unexpected_ok\\n` ) }\n        F e → { ( nurl_print `parse(garbage)=` )\n            ( nurl_print ( parse_err_msg # ParseErr e ) )\n            ( nurl_print `\\n` ) }\n    }\n    : !f ParseErr p4 ( float_parse `-1.5e2` )\n    ?? p4 {\n        T x → { ( pi # i x `parse(-1.5e2)` ) }  // -150\n        F e → { ( nurl_print `parse(-1.5e2)_err\\n` ) }\n    }\n\n    ( nurl_print `done\\n` )\n    ^ 0\n}\n","bytes":4174}