aboutsummaryrefslogtreecommitdiff
path: root/module/text/big-numbers.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/text/big-numbers.scm')
-rw-r--r--module/text/big-numbers.scm31
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))))))