diff options
Diffstat (limited to 'module/text/big-numbers.scm')
-rw-r--r-- | module/text/big-numbers.scm | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/module/text/big-numbers.scm b/module/text/big-numbers.scm new file mode 100644 index 00000000..325cc2f3 --- /dev/null +++ b/module/text/big-numbers.scm @@ -0,0 +1,31 @@ +(define-module (text big-numbers) + :use-module ((hnh util) :select (->>)) + :use-module (hnh util type) + :export (number->exponential-form + power-of-10? + subscript supscript)) + +(define (integer-string-ref str n) + (typecheck str string?) + (typecheck n (and exact? integer?)) + (->> n + number->string + string->list + (map char->integer) + (map (lambda (x) (- x (char->integer #\0)))) + (map (lambda (i) (string-ref str i))) + list->string)) + +(define (subscript n) + (integer-string-ref "₀₁₂₃₄₅₆₇₈₉" n)) + +(define (supscript n) + (integer-string-ref "⁰¹²³⁴⁵⁶⁷⁸⁹" n)) + +;;; Is the number a power of 10? +(define (power-of-10? x) + (integer? (log10 (exact->inexact x)))) + +(define (number->exponential-form n) + (typecheck n (and exact? integer? power-of-10?)) + (string-append "10" (supscript (inexact->exact (round (log10 n)))))) |