From 29a5d5824ca874b2635f9e812e25198e42b5efc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 6 Nov 2023 00:40:42 +0100 Subject: Add procedures for printing big numbers. --- module/text/big-numbers.scm | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 module/text/big-numbers.scm (limited to 'module/text/big-numbers.scm') 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)))))) -- cgit v1.2.3