about summary refs log tree commit diff stats
path: root/409print-float.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-11-28 08:23:15 -0800
committerKartik Agaram <vc@akkartik.com>2020-11-28 08:23:15 -0800
commitba8ee517b7ae1da5cc15d0d619fa564f767c8bca (patch)
treeb0f17c3695e759a66701e05e7ae54ce57c5b77c3 /409print-float.mu
parentbbcf033aff4dd3aad3aa0307e1c3843d5a81c184 (diff)
downloadmu-ba8ee517b7ae1da5cc15d0d619fa564f767c8bca.tar.gz
7293
Diffstat (limited to '409print-float.mu')
-rw-r--r--409print-float.mu242
1 files changed, 2 insertions, 240 deletions
diff --git a/409print-float.mu b/409print-float.mu
index 67985bb4..3dbcde6d 100644
--- a/409print-float.mu
+++ b/409print-float.mu
@@ -1,9 +1,7 @@
-# quick-n-dirty way to print out floats
-
-######## In hex, following C's %a format
+# quick-n-dirty way to print out floats in hex
 # https://www.exploringbinary.com/hexadecimal-floating-point-constants
 
-# examples:
+# example:
 #   0.5 = 0x3f000000 = 0011| 1111 | 0000 | 0000 | 0000 | 0000 | 0000 | 0000
 #                    = 0 | 01111110 | 00000000000000000000000
 #                      +   exponent   mantissa
@@ -196,239 +194,3 @@ fn print-float screen: (addr screen), n: float {
 #? #?   test-print-float-normal
 #?   return 0
 #? }
-
-######## In decimal
-# Try to keep it short.
-
-fn test-print-float-decimal-approximate-normal {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  # 0.5
-  var half/xmm0: float <- rational 1, 2
-  print-float-decimal-approximate screen, half
-  check-screen-row screen, 1, "0.5 ", "F - test-print-float-decimal-approximate-normal 0.5"
-  # 0.25
-  clear-screen screen
-  var quarter/xmm0: float <- rational 1, 4
-  print-float-decimal-approximate screen, quarter
-  check-screen-row screen, 1, "0.25 ", "F - test-print-float-decimal-approximate-normal 0.25"
-  # 0.75
-  clear-screen screen
-  var three-quarters/xmm0: float <- rational 3, 4
-  print-float-decimal-approximate screen, three-quarters
-  check-screen-row screen, 1, "0.75 ", "F - test-print-float-decimal-approximate-normal 0.75"
-  # 0.125
-  clear-screen screen
-  var eighth/xmm0: float <- rational 1, 8
-  print-float-decimal-approximate screen, eighth
-  check-screen-row screen, 1, "0.125 ", "F - test-print-float-decimal-approximate-normal 0.1"
-  # 0.0625; start truncating past 3 decimal places
-  clear-screen screen
-  var sixteenth/xmm0: float <- rational 1, 0x10
-  print-float-decimal-approximate screen, sixteenth
-  check-screen-row screen, 1, "0.062 ", "F - test-print-float-decimal-approximate-normal 0.625"
-}
-
-# print whole integers without decimals
-fn test-print-float-decimal-approximate-integer {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  # 1
-  var one-f/xmm0: float <- rational 1, 1
-  print-float-decimal-approximate screen, one-f
-  check-screen-row screen, 1, "1 ", "F - test-print-float-decimal-approximate-integer 1"
-  # 2
-  clear-screen screen
-  var two-f/xmm0: float <- rational 2, 1
-  print-float-decimal-approximate screen, two-f
-  check-screen-row screen, 1, "2 ", "F - test-print-float-decimal-approximate-integer 2"
-  # 10
-  clear-screen screen
-  var ten-f/xmm0: float <- rational 0xa, 1
-  print-float-decimal-approximate screen, ten-f
-  check-screen-row screen, 1, "10 ", "F - test-print-float-decimal-approximate-integer 10"
-  # -10
-  clear-screen screen
-  var minus-ten-f/xmm0: float <- rational -0xa, 1
-  print-float-decimal-approximate screen, minus-ten-f
-  check-screen-row screen, 1, "-10 ", "F - test-print-float-decimal-approximate-integer -10"
-  # 100,000 - start using scientific notation
-  var hundred-thousand/eax: int <- copy 0x186a0
-  var hundred-thousand-f/xmm0: float <- convert hundred-thousand
-  print-float-decimal-approximate screen, hundred-thousand-f
-  check-screen-row screen, 1, "1e5 ", "F - test-print-float-decimal-approximate-integer 100,000"
-}
-
-fn test-print-float-decimal-approximate-zero {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  var zero: float
-  print-float-decimal-approximate screen, zero
-  check-screen-row screen, 1, "0 ", "F - test-print-float-decimal-approximate-zero"
-}
-
-fn test-print-float-decimal-approximate-negative-zero {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  var n: int
-  copy-to n, 0x80000000
-  var negative-zero/xmm0: float <- reinterpret n
-  print-float-decimal-approximate screen, negative-zero
-  check-screen-row screen, 1, "-0 ", "F - test-print-float-decimal-approximate-negative-zero"
-}
-
-fn test-print-float-decimal-approximate-infinity {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  var n: int
-  #          0|11111111|00000000000000000000000
-  #          0111|1111|1000|0000|0000|0000|0000|0000
-  copy-to n, 0x7f800000
-  var infinity/xmm0: float <- reinterpret n
-  print-float-decimal-approximate screen, infinity
-  check-screen-row screen, 1, "Inf ", "F - test-print-float-decimal-approximate-infinity"
-}
-
-fn test-print-float-decimal-approximate-negative-infinity {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  var n: int
-  copy-to n, 0xff800000
-  var negative-infinity/xmm0: float <- reinterpret n
-  print-float-decimal-approximate screen, negative-infinity
-  check-screen-row screen, 1, "-Inf ", "F - test-print-float-decimal-approximate-negative-infinity"
-}
-
-fn test-print-float-decimal-approximate-not-a-number {
-  var screen-on-stack: screen
-  var screen/esi: (addr screen) <- address screen-on-stack
-  initialize-screen screen, 5, 0x20  # 32 columns should be more than enough
-  var n: int
-  copy-to n, 0xffffffff  # exponent must be all 1's, and mantissa must be non-zero
-  var negative-infinity/xmm0: float <- reinterpret n
-  print-float-decimal-approximate screen, negative-infinity
-  check-screen-row screen, 1, "NaN ", "F - test-print-float-decimal-approximate-not-a-number"
-}
-
-fn print-float-decimal-approximate screen: (addr screen), n: float {
-  # - special names
-  var bits/eax: int <- reinterpret n
-  compare bits, 0
-  {
-    break-if-!=
-    print-string screen, "0"
-    return
-  }
-  compare bits, 0x80000000
-  {
-    break-if-!=
-    print-string screen, "-0"
-    return
-  }
-  compare bits, 0x7f800000
-  {
-    break-if-!=
-    print-string screen, "Inf"
-    return
-  }
-  compare bits, 0xff800000
-  {
-    break-if-!=
-    print-string screen, "-Inf"
-    return
-  }
-  var exponent/ecx: int <- copy bits
-  exponent <- shift-right 0x17  # 23 bits of mantissa
-  exponent <- and 0xff
-#?   print-string 0, "exponent0: "
-#?   print-int32-hex 0, exponent
-#?   print-string 0, "\n"
-  exponent <- subtract 0x7f
-  compare exponent, 0x80
-  {
-    break-if-!=
-    print-string screen, "NaN"
-    return
-  }
-  # - regular numbers
-  var sign/edx: int <- copy bits
-  sign <- shift-right 0x1f
-  {
-    compare sign, 1
-    break-if-!=
-    print-string screen, "-"
-  }
-  var mantissa/ebx: int <- copy bits
-  mantissa <- and 0x7fffff
-#?   print-string 0, "mantissa0: "
-#?   print-int32-hex 0, mantissa
-#?   print-string 0, "\n"
-  # whole integers
-  compare exponent, 0
-  {
-    break-if-<
-#?     print-string 0, "mantissa: "
-#?     print-int32-hex 0, mantissa
-#?     print-string 0, "\n"
-#?     print-string 0, "exponent: "
-#?     print-int32-hex 0, exponent
-#?     print-string 0, "\n"
-    var tmp/eax: int <- copy mantissa
-    tmp <- shift-left 9  # move to MSB
-    tmp <- repeated-shift-left tmp, exponent
-    compare tmp, 0
-    break-if-!=
-    var result/eax: int <- copy mantissa
-    result <- or 0x00800000  # insert implicit 1
-#?     print-string 0, "mantissa2: "
-#?     print-int32-hex 0, result
-#?     print-string 0, "\n"
-    var all-but-exponent/edx: int <- copy 0x17  # 23 bits for mantissa treated as a whole number
-    all-but-exponent <- subtract exponent
-    result <- repeated-shift-right result, all-but-exponent
-#?     print-string 0, "result: "
-#?     print-int32-hex 0, result
-#?     print-string 0, "\n"
-    print-int32-decimal screen, result
-    return
-  }
-  $print-float-decimal-approximate:leading-digit: {
-    # check for subnormal numbers
-    compare exponent, -0x7f
-    {
-      break-if-!=
-      print-string screen, "0"
-      exponent <- increment
-      break $print-float-decimal-approximate:leading-digit
-    }
-    # normal numbers
-    print-string screen, "1"
-  }
-  var mantissa/ebx: int <- copy bits
-  mantissa <- and 0x7fffff
-  compare mantissa, 0
-  {
-    break-if-=
-    print-string screen, "."
-    # TODO
-    mantissa <- shift-left 1  # whole number of nibbles
-    print-int32-hex-bits screen, mantissa, 0x18
-  }
-  # print exponent if necessary
-  compare exponent, 0
-  break-if-=
-  print-string screen, "P"
-  print-int32-decimal screen, exponent
-}
-
-#? fn main -> _/ebx: int {
-#? #?   run-tests
-#?   test-print-float-decimal-approximate-integer-5
-#?   return 0
-#? }