User Tools

Site Tools


pdclib:floatingpoint

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
pdclib:floatingpoint [2019/10/17 15:28]
solar [Fixed Point]
pdclib:floatingpoint [2019/10/18 14:40]
solar [Fixed Point Fraction Output]
Line 157: Line 157:
 Steele & White approach the presentation of their Dragon algorithm as a series of "lesser" algorithms building on each other. Steele & White approach the presentation of their Dragon algorithm as a series of "lesser" algorithms building on each other.
  
-==== Fixed Point ====+==== Fixed Point Fraction Output ====
  
 Given: Given:
Line 176: Line 176:
   - Each digit of //F// is output before the next is generated; no "back up" for corrections.   - Each digit of //F// is output before the next is generated; no "back up" for corrections.
  
-Algorithm:+Algorithm <m>(FP)^3</m> (Finite-Precision Fixed-Point Fraction Printout):
  
   * <m>k = 0, R = f, M = { b ^ { -n } / 2 }</m>   * <m>k = 0, R = f, M = { b ^ { -n } / 2 }</m>
Line 207: Line 207:
     * multiply <m>M = 0.015625</m> by <m>B = 10</m> for new <m>M = 0.15625</m>     * multiply <m>M = 0.015625</m> by <m>B = 10</m> for new <m>M = 0.15625</m>
     * Fractional part <m>0.835</m> is larger than mask <m>0.15625</m>, and smaller than <m>1 - 0.15625 = 0.84375</m>, so <m>6</m> is our first (fractional) digit, and the loop continues     * Fractional part <m>0.835</m> is larger than mask <m>0.15625</m>, and smaller than <m>1 - 0.15625 = 0.84375</m>, so <m>6</m> is our first (fractional) digit, and the loop continues
-  * Second (<m>k = 2</m> loop +  * Second (<m>k = 2</m>loop 
-    * multiply <m>R = 0.835</m> by <m>B = 10</m> for integral part <m>8</m>, fractional part <m>0.35<m> +    * multiply <m>R = 0.835</m> by <m>B = 10</m> for integral part <m>8</m>, fractional part <m>0.35</m> 
-    * multiply <m>M = 0.15625<m> by <m>B = 10</m> for new <m>M = 1.5625</m>+    * multiply <m>M = 0.15625</m> by <m>B = 10</m> for new <m>M = 1.5625</m>
     * Fractional part <m>.35</m> is smaller than mask <m>1.5625</m>, and not smaller than <m>1 - 1.5625 = -0.5625</m>, so the loop terminates     * Fractional part <m>.35</m> is smaller than mask <m>1.5625</m>, and not smaller than <m>1 - 1.5625 = -0.5625</m>, so the loop terminates
   * Post-loop   * Post-loop
     * Fractional part <m>.35</m> is smaller than <m>1/2</m>, so <m>8</m> is our next fractional digit     * Fractional part <m>.35</m> is smaller than <m>1/2</m>, so <m>8</m> is our next fractional digit
     * We have <m>N = k = 2</m> fractional digits in our result of <m>0.68</m>, which is the smallest <m>N</m> that uniquely identifies our original <m>f = .10110</m>     * We have <m>N = k = 2</m> fractional digits in our result of <m>0.68</m>, which is the smallest <m>N</m> that uniquely identifies our original <m>f = .10110</m>
 +
 +==== Floating-Point Printout ====
 +
 +Given:
 +
 +  * A base //b// floating-point number <m>v = f * b ^ (e - p)</m>, where //e//, //f//, and //p// are integers with <m>p >= 0</m> and <m>0 <= f < b ^ p</m>.
 +
 +Output:
 +
 +  * An approximate representation to base //B//, using exponential notation if the value is very large or very small.
 +
 +Algorithm (Dragon2):
 +
 +   * Compute <m>v prime = v * B ^ {-x}</m>, where <m>x</m> is chosen so that the result either is between 1 / //B// and 1, or between 1 and //B//
 +   * Print the integer part of <m>v prime</m>
 +   * Print a decimal point
 +   * Take the fractional part of <m>v prime</m>, let <m>n = p - floor ( log_ b v prime ) - 1</m>
 +   * Apply algorithm <m>(FP)^3</m> to //f// and //n//
 +   * If <m>x</m> was not zero, append the letter "E" and a representation of the scale factor <m>x</m>
pdclib/floatingpoint.txt · Last modified: 2019/10/21 10:13 by solar