source: project/release/4/unitconv/trunk/unitconv.scm @ 15177

Last change on this file since 15177 was 15177, checked in by Ivan Raikov, 11 years ago

unitconv now exports IEC prefixes

File size: 21.2 KB
Line 
1;;
2;; Based on code by  Dmitry A. Kazakov  and Gordon S. Novak
3;;
4;; TODO: implement non-strict conversion (e.g. mass <-> energy, mass <-> weight)
5;;
6
7(module unitconv
8
9        (unit-factor-eval
10         (define-quantity quantity-expr-eval)
11         (define-unit unit-factor-eval)
12         make-unit-prefix
13
14         unitconv:error
15         make-quantity 
16         quantity?
17         quantity-name
18         quantity-int
19         make-unit
20         unit?
21         unit-equal?
22         unit-name
23         unit-factor
24         unit-prefix
25         unit-convert
26
27         Unity       
28         Length     
29         Time       
30         Temperature 
31         Mass       
32         Current     
33         Luminosity 
34         Substance   
35         Currency   
36         Information
37
38         ;;
39         ;; Geometry
40         ;;
41         Area
42         Volume
43
44         ;;
45         ;; Mechanics
46         ;;
47         Velocity
48         Acceleration
49         Force
50         Pressure
51         Energy
52         Power
53
54         ;;
55         ;; Electricity
56         ;;
57         Charge
58         Potential
59         Capacitance
60         Resistance
61         Conductance
62         Inductance
63
64         ;;
65         ;; Chemistry
66         ;;
67         Concentration
68         Density
69
70         ;;
71         ;; Optic
72         ;;
73         Luminance
74
75         ;;
76         ;; Other
77         ;;
78         Frequency
79
80
81         unitless
82         
83         ;; SI unit prefixes
84         yocto
85         zepto
86         atto
87         femto
88         pico
89         nano
90         micro
91         milli
92         centi
93         deci
94         deca
95         hecto
96         kilo
97         mega
98         giga
99         tera
100         peta
101         exa
102         zetta
103         yotta
104
105         ;; Time multiples
106         twelve
107         sixty
108
109         ;; Angles (dimensionless ratio)
110         radian
111         degree
112
113         ;; Units of length
114         meter
115         inch
116         foot
117         angstrom
118         parsec
119         millimeter
120         micrometer
121         micron
122
123         ;; Units of area and volume
124         square-meter
125         square-inch
126         square-micron
127         square-millimeter
128         cubic-meter
129         liter
130
131         ;; Units of mass
132         kilogram
133         gram
134         milligram
135         pound
136         slug
137         atomic-mass-unit
138
139         ;; Units of time
140         second
141         hour
142
143         ;; Units of acceleration
144         meters-per-second-squared
145
146         ;; Units of frequency
147         hertz
148
149         ;; Units of force
150         newton
151         pound-force
152
153         ;; Units of power
154         watt
155         horsepower
156
157         ;; Units of energy
158         joule
159         electron-volt
160         kilowatt-hour
161         calorie
162         erg
163         british-thermal-unit
164
165         ;; Units of current
166         ampere
167
168         ;; Units of electric charge
169         coulomb
170
171         ;; Units of electric potential
172         volt
173
174         ;; Units of resistance
175         ohm
176
177         ;; Units of capacitance
178         farad
179         microfarad
180         picofarad
181
182         ;; Units of conductance
183         siemens
184
185         ;; Units of inductance
186         henry
187         millihenry
188         microhenry
189
190         ;; Units of substance
191         mole
192
193         ;; Units of density
194         rho
195
196         ;; Units of concentration
197         molarity
198         parts-per-million
199
200         ;; Units of temperature
201         degK
202
203         ;; Units of information quantity, evidence, and information entropy
204
205         ;; bit = log_2(p)     (Shannon)
206         bit
207
208         ;; byte = 8 bits
209         byte
210
211         ;; nat = log_e(p)     (Boulton and Wallace)
212         nat
213
214         ;; ban = log_10(p)    (Hartley, Turing, and Good)
215         ban
216
217         ;; The deciban is the smallest weight of evidence discernible by a human
218         ;; deciban = 10*log_10(p)
219         deciban
220
221         ;; IEC standard prefixes
222         kibi   
223         mebi   
224         gibi   
225         tebi   
226         pebi   
227         exbi   
228         zebi   
229         yobi   
230
231         ;; bits
232         kilobit
233         megabit
234         gigabit
235         terabit
236         petabit
237         exabit
238         zettabit
239         yottabit
240         kibibit
241         mebibit
242         gibibit
243         tebibit
244         pebibit
245         exbibit
246         zebibit
247         yobibit
248
249         ;; bytes
250         kilobyte
251         megabyte
252         gigabyte
253         terabyte
254         petabyte
255         exabyte
256         zettabyte
257         yottabyte
258         kibibyte
259         mebibyte
260         gibibyte
261         tebibyte
262         pebibyte
263         exbibyte
264         zebibyte
265         yobibyte
266
267         ;; bit rates
268         bits-per-second
269         kilobits-per-second
270         megabits-per-second
271         gigabits-per-second
272         terabits-per-second
273         petabits-per-second
274         exabits-per-second
275         zettabits-per-second
276         yottabits-per-second
277
278         ;; byte rates
279         bytes-per-second
280         kilobytes-per-second
281         megabytes-per-second
282         gigabytes-per-second
283         terabytes-per-second
284         petabytes-per-second
285         exabytes-per-second
286         zettabytes-per-second
287         yottabytes-per-second
288         
289         )
290       
291
292   (import scheme chicken data-structures extras srfi-4)
293
294   (require-extension datatype matchable srfi-4)       
295   (import-for-syntax matchable chicken)       
296
297(define pi 3.14159265358979)
298
299
300(define (unitconv:error x . rest)
301  (let ((port (open-output-string)))
302    (let loop ((objs (cons x rest)))
303      (if (null? objs)
304          (begin
305            (newline port)
306            (error 'unitconv (get-output-string port)))
307          (begin (display (car objs) port)
308                 (display " " port)
309                 (loop (cdr objs)))))))
310
311
312(define-record quantity name int)
313
314(define-record-printer (quantity x out)
315  (if (zero? (quantity-int x))
316      (fprintf out "#(quantity Unity)")
317      (fprintf out "#(quantity ~S ~S)"
318               (quantity-name x)
319               (quantity-int x))))
320
321
322;; The number of base quantities defined
323(define Q 9)
324
325(define dref s32vector-ref)
326
327;; The sizes of the field assigned to each base quantity; a field size
328;; of 20 allows a value range of +-9 for the power of that quantity
329(define dimsizes  (s32vector 20 20 20 10 10 10 10 10 20))
330
331;; Multipliers that can be used to move a vector value to its proper
332;; field position; defined as follows:
333;;
334;;  dimvals_{0} = 1
335;;  dimvals_{i} = dimvals_{i-1} * dimsizes_{i-1}   i > 0
336;;
337(define dimvals  (let loop ((i 1) (lst (list 1)))
338                   (if (< i Q)
339                       (let ((x  (* (car lst) (dref dimsizes (- i 1)))))
340                         (loop (+ 1 i) (cons x lst)))
341                       (list->s32vector (reverse lst)))))
342
343;; (s32vector 1 20 400 8000 80000 800000 8000000 80000000))
344
345;; A value that, when added to a dimension integer will make it
346;; positive and will bias each vector component within its field by
347;; half the size of the field; defined as:
348;;
349;;  dimbias = sum_{i=0}^{7}\frac{dimvals_{i} * dimsizes_{i}}{2}
350;;
351
352(define dimbias  (let loop ((i 0)  (sum 0))
353                   (if (< i Q)
354                       (loop (+ i 1) (+ sum (/ (* (dref dimvals i) (dref dimsizes i)) 2)))
355                       sum)))
356                       
357
358;; 444444210
359
360;; Compute a dimension integer from a dimension vector
361;;
362;; For example, the dimension integer for force can be calculated as
363;; follows:
364;;
365;; force = length * time^{-2} * mass
366;;
367;; (dimint (s32vector 1 -2 0 1 0 0 0 0))
368;; => 7961
369;;
370(define (dimint v)
371  (let loop ((i (- Q 1)) (sum 0))
372    (if (fx<= 0 i)
373        (loop (fx- i 1)  (+ sum (* (dref dimvals i) (dref v i))))
374        sum)))
375
376
377(define-syntax define-base-quantity
378  (lambda (x r c)
379    (let ((name   (cadr x))
380          (value  (caddr x))
381          (%define (r 'define)))
382      `(,%define ,name (make-quantity ',name ,value)))))
383
384
385(define-base-quantity  Unity          0)
386(define-base-quantity  Length         (dref dimvals 0))
387(define-base-quantity  Time           (dref dimvals 1))
388(define-base-quantity  Temperature    (dref dimvals 2))
389(define-base-quantity  Mass           (dref dimvals 3))
390(define-base-quantity  Current        (dref dimvals 4))
391(define-base-quantity  Luminosity     (dref dimvals 5))
392(define-base-quantity  Substance      (dref dimvals 6))
393(define-base-quantity  Currency       (dref dimvals 7))
394(define-base-quantity  Information    (dref dimvals 8))
395
396
397(define-record unit name dims factor abbrevs)
398
399(define (unit-equal? x y)
400  (and (= (quantity-int (unit-dims x)) (quantity-int (unit-dims y)))
401       (= (unit-factor x) (unit-factor y))))
402 
403(define-record-printer (unit x out)
404  (let ((dims     (unit-dims x))
405        (abbrevs  (unit-abbrevs x)))
406    (if (null? abbrevs)
407        (fprintf out "#(unit ~S " (unit-name x))
408        (fprintf out "#(unit ~S ~S " (unit-name x) (unit-abbrevs x)))
409    (fprintf out "[~S] ~S)"
410           (quantity-name (unit-dims x))
411           (unit-factor x))))
412
413(define (unit-prefix prefix u abbrevs)
414  (or (and (unit? prefix) (unit? u)) 
415      (unitconv:error 'unit-prefix ": invalid unit: " u))
416  (if (not (= 0 (quantity-int (unit-dims prefix))))
417      (unitconv:error 'unit-prefix ": prefix must be dimensionless: " prefix))
418  (if (zero? (quantity-int (unit-dims u)))
419      (unitconv:error 'unit-prefix ": unit must not be dimensionless: " u))
420  (make-unit (string->symbol
421              (string-append (symbol->string (unit-name prefix))
422                             (symbol->string (unit-name u))))
423             (unit-dims u)
424             (* (unit-factor prefix) (unit-factor u))
425             abbrevs))
426     
427
428;;
429;; Unit conversion
430;;
431(define (unit-convert src dest . vals)
432  (or (and (unit? src) (unit? dest)) 
433      (unitconv:error 'unit-convert ": invalid unit: " src dest))
434  (if (= (quantity-int (unit-dims src)) (quantity-int (unit-dims dest)))
435      (let ((f  (/ (unit-factor src) (unit-factor dest))))
436        (if (null? vals)  f
437            ((lambda (x) (if (null? (cdr x)) (car x) x)) (map (lambda (x) (* f x)) vals))))
438      (unitconv:error 'unit-convert ": given units are of different dimensions: source=" src "; dest= " dest)))
439
440
441(define-syntax quantity-expr-eval
442  (lambda (x r c)
443    (let ((expr       (cadr x))
444          (left?      (caddr x))
445          (%let       (r 'let))
446          (%cond      (r 'cond))
447          (%else      (r 'else))
448          (integer?   (r 'integer?))
449          (not        (r 'not))
450          (and        (r 'and))
451          (x1         (r 'x1))
452          (y1         (r 'y1))
453          (quantity-expr-eval    (r 'quantity-expr-eval))
454          (quantity?       (r 'quantity?))
455          (quantity-int    (r 'quantity-int)))
456         
457      (match expr 
458             ((op x y)
459              `(,%let ((,x1  (,quantity-expr-eval ,x #t))
460                       (,y1  (,quantity-expr-eval ,y ,left?)))
461                 ,(case op 
462                    ((**)    `(* ,x1 ,y1))
463                    ((*)     `(+ ,x1 ,y1))
464                    ((/)     `(- ,x1 ,y1))
465                    (else (unitconv:error 'quantity-expr-eval ": unknown quantity operation " op)))))
466             
467             (x
468              `(,%cond ((,quantity? ,x)    (,quantity-int ,x))
469                       ((,and (,not ,left?) (,integer? ,x)) ,x)
470                       ((,and ,left? (,integer? ,x))     
471                        (unitconv:error 'quantity-expr-eval 
472                                        "integers are not allowed as the left operand of quantity expression"))
473                       (,%else  (unitconv:error 'quantity-expr-eval ": unknown quantity " ,x))))))))
474         
475 
476
477(define-syntax define-quantity
478  (lambda (x r c)
479    (let ((name (cadr x))
480          (expr (caddr x))
481          (%define (r 'define))
482          (make-quantity (r 'make-quantity))
483          (quantity-expr-eval (r 'quantity-expr-eval)))
484      `(,%define ,name (,make-quantity ',name (,quantity-expr-eval ,expr #f))))))
485
486
487(define-for-syntax (binop-fold op lst)
488  (if (null? lst) lst
489      (match lst
490             ((x)   x)
491             ((x y) `(,op ,x ,y))
492             ((x y . rest) `(,op (,op ,x ,y) ,(binop-fold op rest)))
493             ((x . rest) `(,op ,x ,(binop-fold op rest))))))
494
495
496(define-syntax unit-factor-eval
497  (lambda (x r c)
498    (let ((expr (cadr x))
499          (%let       (r 'let))
500          (%cond      (r 'cond))
501          (%else      (r 'else))
502          (x1         (r 'x1))
503          (y1         (r 'y1))
504          (unit?        (r 'unit?))
505          (unit-factor  (r 'unit-factor))
506          (number?      (r 'number?)))
507      (match expr 
508             ((op x y) 
509              `(,%let ((,x1  (unit-factor-eval ,x))
510                       (,y1  (unit-factor-eval ,y)))
511                 ,(case op 
512                    ((*)     `(* ,x1 ,y1))
513                    ((/)     `(/ ,x1 ,y1))
514                    (else (unitconv:error 'unit-factor-eval ": unknown unit factor operation " op)))))
515             
516             ((op x . y) 
517              `(unit-factor-eval ,(binop-fold op (cons x y))))
518             
519             (x         `(cond ((,unit? ,x)   
520                                (,unit-factor ,x))
521                               ((,number? ,x)  ,x)
522                               (else  (unitconv:error 'unit-factor-eval ": unknown unit " ,x))))))))
523         
524 
525
526(define-syntax define-unit
527  (lambda (x r c)
528    (let ((name (cadr x))
529          (dims (caddr x))
530          (factor (cadddr x))
531          (abbrevs (cddddr x))
532          (%define (r 'define)))
533      `(,%define ,name (make-unit ',name ,dims (unit-factor-eval ,factor) ',abbrevs)))))
534
535
536(define-syntax make-unit-prefix
537  (lambda (x r c)
538    (let ((prefix (cadr x))
539          (unit (caddr x))
540          (abbrevs (cdddr x)))
541      `(unit-prefix ,prefix ,unit ',abbrevs))))
542
543
544;;
545;; Geometry
546;;
547(define-quantity   Area     (** Length 2))
548(define-quantity   Volume   (** Length 3))
549
550;;
551;; Mechanics
552;;
553(define-quantity   Velocity      (/ Length Time))
554(define-quantity   Acceleration  (/ Length (** Time 2)))
555(define-quantity   Force         (* Mass Acceleration))
556(define-quantity   Pressure      (/ Force Area))
557(define-quantity   Energy        (* Force Length))
558(define-quantity   Power         (/ Energy Time))
559
560;;
561;; Electricity
562;;
563(define-quantity   Charge         (* Current Time))
564(define-quantity   Potential      (/ Energy Charge))
565(define-quantity   Capacitance    (/ Charge Potential))
566(define-quantity   Resistance     (/ Potential Current))
567(define-quantity   Conductance    (/ Current Potential))
568(define-quantity   Inductance     (/ (* Potential Time) Current))
569
570;;
571;; Chemistry
572;;
573(define-quantity   Concentration  (/ Substance Volume))
574(define-quantity   Density        (/ Mass Volume))
575
576;;
577;; Optic
578;;
579(define-quantity    Luminance     (/ Luminosity Area))
580
581;;
582;; Other
583;;
584(define-quantity    Frequency     (/ Unity Time))
585
586;;
587;; Information
588;;
589(define-quantity    Rate          (/ Information Time))
590
591
592(define-unit unitless Unity 1.0)
593       
594;; SI unit prefixes
595(define-unit yocto  Unity 1.0e-24)
596(define-unit zepto  Unity 1.0e-21)
597(define-unit atto   Unity 1.0e-18)
598(define-unit femto  Unity 1.0e-15)
599(define-unit pico   Unity 1.0e-12)
600(define-unit nano   Unity 1.0e-9)
601(define-unit micro  Unity 1.0e-6)
602(define-unit milli  Unity 1.0e-3)
603(define-unit centi  Unity 1.0e-2)
604(define-unit deci   Unity 1.0e-1)
605(define-unit deca   Unity  1.0e1)
606(define-unit hecto  Unity  1.0e2)
607(define-unit kilo   Unity  1.0e3)
608(define-unit mega   Unity  1.0e6)
609(define-unit giga   Unity  1.0e9)
610(define-unit tera   Unity  1.0e12)
611(define-unit peta   Unity  1.0e15)
612(define-unit exa    Unity  1.0e18)
613(define-unit zetta  Unity  1.0e21)
614(define-unit yotta  Unity  1.0e24)
615
616;; IEC standard prefixes
617(define-unit kibi   Unity  1024)
618(define-unit mebi   Unity  1048576)
619(define-unit gibi   Unity  1073741824)
620(define-unit tebi   Unity  1099511627776)
621(define-unit pebi   Unity  1125899906842624)
622(define-unit exbi   Unity  1152921504606846976)
623(define-unit zebi   Unity  1180591620717411303424)
624(define-unit yobi   Unity  1208925819614629174706176)
625
626;; Time multiples
627(define-unit twelve Unity 12)
628(define-unit sixty  Unity 60)
629
630;; Angles (dimensionless ratio)
631(define-unit radian    Unity  1.0  rad radians)
632(define-unit degree    Unity  (/ pi 180)  deg degrees)
633
634;; Units of length
635(define-unit meter     Length 1.0       m meters)
636(define-unit inch      Length 0.0254    in inches)
637(define-unit foot      Length 0.3048    ft feet)
638(define-unit angstrom  Length 1.0e-10   ang angstroms)
639(define-unit parsec    Length 3.083e16  parsecs)
640(define millimeter     (make-unit-prefix  milli meter mm millimeters))
641(define micrometer     (make-unit-prefix  micro meter um micron microns micrometers))
642(define micron         micrometer)
643
644;; Units of area and volume
645(define-unit square-meter  Area (* meter meter) m^2 m2 meter-squared meters-squared square-meters)
646(define-unit square-inch   Area  (* inch inch) in^2 inch-squared inches-squared square-inches)
647(define-unit square-micron Area (* micrometer micrometer) um^2 micrometer-squared
648                                micrometers-squared micron-squared microns-squared square-microns)
649(define-unit square-millimeter Area (* millimeter millimeter) mm^2 millimeter-squared millimeters-squared
650                                                              square-millimeters)
651
652(define-unit cubic-meter   Volume  (* meter (* meter meter)) m^3 meter-cubed meters-cubed cubic-meters )
653(define-unit liter         Volume  (* 0.001 cubic-meter) L litre liters)
654
655;; Units of mass
656(define-unit kilogram     Mass  1.0       kg kilograms)
657(define-unit gram         Mass  1e-3      g grams)
658(define milligram         (make-unit-prefix  milli gram mg milligrams))
659(define-unit pound        Mass  (* gram 453.59237) lb pounds)
660(define-unit slug         Mass  (* pound 32.17405) slugs)
661(define-unit atomic-mass-unit Mass 1.6605402e-27 amu atomic-mass-units)
662
663;; Units of time
664(define-unit second       Time  1.0       s seconds)
665(define-unit hour         Time  (* sixty (* sixty second)) h hrs hours)
666
667;; Units of acceleration
668(define-unit meters-per-second-squared Acceleration (/ meter (* second second)) m/s2 m/s^2 m/sec2 m/sec^2)
669
670;; Units of frequency
671(define-unit hertz Frequency 1.0 hz)
672
673;; Units of force
674(define-unit newton       Force (/ (* kilogram meter) (* second second)) nt newtons)
675(define-unit pound-force  Force (/ (* slug foot) (* second second)) lbf)
676
677
678;; Units of power
679(define-unit watt         Power (/ (* kilogram meter meter)
680                                   (* second second second))  W watts)
681(define-unit horsepower   Power (* 550 (/ (* foot pound-force) second)) hp)
682
683;; Units of energy
684(define-unit joule Energy  (* newton meter) J joules)
685(define-unit electron-volt Energy  (* 1.60217733e-19 joule) ev electron-volts)
686(define-unit kilowatt-hour Energy  (* kilo (* watt hour)) kwh kilowatt-hours)
687(define-unit calorie       Energy  (* 4.184 joule) cal calories)
688(define-unit erg           Energy  (* 1.0e-7 joule) ergs)
689(define-unit british-thermal-unit Energy (* 1055.056 joule) btu btus)
690
691;; Units of current
692(define-unit ampere  Current 1.0 A amp amps amperes)
693
694;; Units of electric charge
695(define-unit coulomb Charge  (* ampere second) C coulombs)
696
697;; Units of electric potential
698(define-unit volt Potential  (/ (* kilogram meter meter)
699                                (* ampere second second second)) V volts)
700
701;; Units of resistance
702(define-unit ohm Resistance  (/ volt ampere) ohms)
703
704;; Units of capacitance
705(define-unit farad Capacitance  (/ coulomb volt) F farads)
706(define microfarad (make-unit-prefix micro farad uF microfarads))
707(define picofarad  (make-unit-prefix pico farad pF picofarads))
708
709;; Units of conductance
710(define-unit siemens Conductance (/ ampere volt) S mho)
711
712;; Units of inductance
713(define-unit henry Inductance  (/ (* meter meter kilogram)
714                                  (* ampere ampere second second)) H)
715(define millihenry (make-unit-prefix milli henry mH))
716(define microhenry (make-unit-prefix micro henry uH))
717
718;; Units of substance
719(define-unit mole Substance 1.0 mol moles)
720
721;; Units of density
722(define-unit rho Density (/ kilogram cubic-meter))
723
724;; Units of concentration
725(define-unit molarity Concentration (/ mole liter) M mol/L)
726(define-unit parts-per-million Concentration (/ milligram kilogram) ppm)
727
728;; Units of temperature
729(define-unit degK       Temperature  1.0       K)
730
731;; Units of information quantity, evidence, and information entropy
732
733;; bit = log_2(p)     (Shannon)
734(define-unit bit      Information  1                 b bits
735  shannon shannons Sh)
736
737;; byte = 8 bits
738(define-unit byte     Information  8                 B bytes)
739
740;; nat = log_e(p)     (Boulton and Wallace)
741(define-unit nat      Information  1.44269504088896  nats
742  nit nits
743  nepit nepits)
744
745;; ban = log_10(p)    (Hartley, Turing, and Good)
746(define-unit ban      Information  3.32192809488736  bans
747  hartley hartleys
748  Hart Harts
749  dit dits)
750
751;; The deciban is the smallest weight of evidence discernible by a human
752;; deciban = 10*log_10(p)
753(define-unit deciban  Information  (/ ban 10)        db decibans)
754
755;; bits
756(define kilobit   (make-unit-prefix kilo  bit   kb kilobits))
757(define megabit   (make-unit-prefix mega  bit   Mb megabits))
758(define gigabit   (make-unit-prefix giga  bit   Gb gigabits))
759(define terabit   (make-unit-prefix tera  bit   Tb terabits))
760(define petabit   (make-unit-prefix peta  bit   Pb petabits))
761(define exabit    (make-unit-prefix exa   bit   Eb exabits))
762(define zettabit  (make-unit-prefix zetta bit   Zb zettabits))
763(define yottabit  (make-unit-prefix yotta bit   Yb yottabits))
764(define kibibit   (make-unit-prefix kibi  bit   Kib kibibits))
765(define mebibit   (make-unit-prefix mebi  bit   Mib mebibits))
766(define gibibit   (make-unit-prefix gibi  bit   Gib gibibits))
767(define tebibit   (make-unit-prefix tebi  bit   Tib tebibits))
768(define pebibit   (make-unit-prefix pebi  bit   Pib pebibits))
769(define exbibit   (make-unit-prefix exbi  bit   Eib exbibits))
770(define zebibit   (make-unit-prefix zebi  bit   Zib zebibits))
771(define yobibit   (make-unit-prefix yobi  bit   Yib yobibits))
772
773;; bytes
774(define kilobyte  (make-unit-prefix kilo  byte  kB kilobytes))
775(define megabyte  (make-unit-prefix mega  byte  MB megabytes))
776(define gigabyte  (make-unit-prefix giga  byte  GB gigabytes))
777(define terabyte  (make-unit-prefix tera  byte  TB terabytes))
778(define petabyte  (make-unit-prefix peta  byte  PB petabytes))
779(define exabyte   (make-unit-prefix exa   byte  EB exabytes))
780(define zettabyte (make-unit-prefix zetta byte  ZB zettabytes))
781(define yottabyte (make-unit-prefix yotta byte  YB yottabytes))
782(define kibibyte  (make-unit-prefix kibi  byte  KiB kibibytes))
783(define mebibyte  (make-unit-prefix mebi  byte  MiB mebibytes))
784(define gibibyte  (make-unit-prefix gibi  byte  GiB gibibytes))
785(define tebibyte  (make-unit-prefix tebi  byte  TiB tebibytes))
786(define pebibyte  (make-unit-prefix pebi  byte  PiB pebibytes))
787(define exbibyte  (make-unit-prefix exbi  byte  EiB exbibytes))
788(define zebibyte  (make-unit-prefix zebi  byte  ZiB zebibytes))
789(define yobibyte  (make-unit-prefix yobi  byte  YiB yobibytes))
790
791;; bit rates
792(define-unit       bits-per-second  Rate  (/ bit       second)  bps)
793(define-unit   kilobits-per-second  Rate  (/ kilobit   second)  kbps)
794(define-unit   megabits-per-second  Rate  (/ megabit   second)  Mbps)
795(define-unit   gigabits-per-second  Rate  (/ gigabit   second)  Gbps)
796(define-unit   terabits-per-second  Rate  (/ terabit   second)  Tbps)
797(define-unit   petabits-per-second  Rate  (/ petabit   second)  Pbps)
798(define-unit    exabits-per-second  Rate  (/ exabit    second)  Ebps)
799(define-unit  zettabits-per-second  Rate  (/ zettabit  second)  Zbps)
800(define-unit  yottabits-per-second  Rate  (/ yottabit  second)  Ybps)
801
802;; byte rates
803(define-unit      bytes-per-second  Rate  (/ byte      second)  Bps)
804(define-unit  kilobytes-per-second  Rate  (/ kilobyte  second)  kBps)
805(define-unit  megabytes-per-second  Rate  (/ megabyte  second)  MBps)
806(define-unit  gigabytes-per-second  Rate  (/ gigabyte  second)  GBps)
807(define-unit  terabytes-per-second  Rate  (/ terabyte  second)  TBps)
808(define-unit  petabytes-per-second  Rate  (/ petabyte  second)  PBps)
809(define-unit   exabytes-per-second  Rate  (/ exabyte   second)  EBps)
810(define-unit zettabytes-per-second  Rate  (/ zettabyte second)  ZBps)
811(define-unit yottabytes-per-second  Rate  (/ yottabyte second)  YBps)
812
813)
Note: See TracBrowser for help on using the repository browser.