From e4b29d85a8508402e148d62cceaa97a4388ac209 Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 11 Jan 2026 14:45:08 -0500 Subject: Rework reals --- src/stdlib/reals.h | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'src/stdlib/reals.h') diff --git a/src/stdlib/reals.h b/src/stdlib/reals.h index 8750fdbb..ff880de7 100644 --- a/src/stdlib/reals.h +++ b/src/stdlib/reals.h @@ -4,26 +4,39 @@ #include "datatypes.h" #include "types.h" -#define NONE_REAL ((Real_t)NULL) +// NaN-boxing scheme: use quiet NaN space for pointers +// IEEE 754: NaN = exponent all 1s, mantissa non-zero +// Quiet NaN: sign bit can be anything, bit 51 = 1 +#define QNAN_MASK 0x7FF8000000000000ULL +#define TAG_MASK 0x0007000000000000ULL +#define PTR_MASK 0x0000FFFFFFFFFFFFULL -Int_t Real$compute(Real_t r, int64_t decimals); -Text_t Real$value_as_text(Real_t x, int64_t decimals); +#define REAL_TAG_BIGINT 0x0001000000000000ULL +#define REAL_TAG_RATIONAL 0x0002000000000000ULL +#define REAL_TAG_CONSTRUCTIVE 0x0003000000000000ULL +#define REAL_TAG_SYMBOLIC 0x0004000000000000ULL +#define REAL_TAG_NONE 0x0005000000000000ULL + +#define NONE_REAL ((Real_t){.u64 = QNAN_MASK | REAL_TAG_NONE}) + +Text_t Real$value_as_text(Real_t x); OptionalReal_t Real$parse(Text_t text, Text_t *remainder); Real_t Real$from_text(Text_t text); Real_t Real$from_float64(double n); Real_t Real$from_int(Int_t i); -double Real$as_float64(Real_t x); -Int_t Real$as_int(Real_t x); +double Real$as_float64(Real_t n, bool truncate); +Int_t Real$as_int(Real_t x, bool truncate); Real_t Real$negative(Real_t x); -Real_t Real$sqrt(Real_t x); Real_t Real$plus(Real_t x, Real_t y); Real_t Real$minus(Real_t x, Real_t y); Real_t Real$times(Real_t x, Real_t y); Real_t Real$divided_by(Real_t x, Real_t y); -Real_t Real$left_shifted(Real_t x, Int_t amount); -Real_t Real$right_shifted(Real_t x, Int_t amount); +Real_t Real$power(Real_t base, Real_t exp); +Real_t Real$sqrt(Real_t x); + +int Real$test(); extern const TypeInfo_t Real$info; -- cgit v1.2.3