Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * rational fractions
  3  *
  4  * Copyright (C) 2009 emlix GmbH, Oskar Schirmer <os@emlix.com>
  5  *
  6  * helper functions when coping with rational numbers
  7  */
  8 
  9 #include <linux/rational.h>
 10 
 11 /*
 12  * calculate best rational approximation for a given fraction
 13  * taking into account restricted register size, e.g. to find
 14  * appropriate values for a pll with 5 bit denominator and
 15  * 8 bit numerator register fields, trying to set up with a
 16  * frequency ratio of 3.1415, one would say:
 17  *
 18  * rational_best_approximation(31415, 10000,
 19  *              (1 << 8) - 1, (1 << 5) - 1, &n, &d);
 20  *
 21  * you may look at given_numerator as a fixed point number,
 22  * with the fractional part size described in given_denominator.
 23  *
 24  * for theoretical background, see:
 25  * http://en.wikipedia.org/wiki/Continued_fraction
 26  */
 27 
 28 void rational_best_approximation(
 29         unsigned long given_numerator, unsigned long given_denominator,
 30         unsigned long max_numerator, unsigned long max_denominator,
 31         unsigned long *best_numerator, unsigned long *best_denominator)
 32 {
 33         unsigned long n, d, n0, d0, n1, d1;
 34         n = given_numerator;
 35         d = given_denominator;
 36         n0 = d1 = 0;
 37         n1 = d0 = 1;
 38         for (;;) {
 39                 unsigned long t, a;
 40                 if ((n1 > max_numerator) || (d1 > max_denominator)) {
 41                         n1 = n0;
 42                         d1 = d0;
 43                         break;
 44                 }
 45                 if (d == 0)
 46                         break;
 47                 t = d;
 48                 a = n / d;
 49                 d = n % d;
 50                 n = t;
 51                 t = n0 + a * n1;
 52                 n0 = n1;
 53                 n1 = t;
 54                 t = d0 + a * d1;
 55                 d0 = d1;
 56                 d1 = t;
 57         }
 58         *best_numerator = n1;
 59         *best_denominator = d1;
 60 }
 61 
 62 EXPORT_SYMBOL(rational_best_approximation);
 63 
  This page was automatically generated by the LXR engine.