Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 146309
b: refs/heads/master
c: 8759ef3
h: refs/heads/master
i:
  146307: 237597f
v: v3
  • Loading branch information
Oskar Schirmer authored and Linus Torvalds committed Jun 11, 2009
1 parent 849aa65 commit f054f4f
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9f322ad064f9210e7d472dfe77e702274d5c9dba
refs/heads/master: 8759ef32d992fc6c0bcbe40fca7aa302190918a5
19 changes: 19 additions & 0 deletions trunk/include/linux/rational.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* rational fractions
*
* Copyright (C) 2009 emlix GmbH, Oskar Schirmer <os@emlix.com>
*
* helper functions when coping with rational numbers,
* e.g. when calculating optimum numerator/denominator pairs for
* pll configuration taking into account restricted register size
*/

#ifndef _LINUX_RATIONAL_H
#define _LINUX_RATIONAL_H

void rational_best_approximation(
unsigned long given_numerator, unsigned long given_denominator,
unsigned long max_numerator, unsigned long max_denominator,
unsigned long *best_numerator, unsigned long *best_denominator);

#endif /* _LINUX_RATIONAL_H */
3 changes: 3 additions & 0 deletions trunk/lib/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ menu "Library routines"
config BITREVERSE
tristate

config RATIONAL
boolean

config GENERIC_FIND_FIRST_BIT
bool

Expand Down
1 change: 1 addition & 0 deletions trunk/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ ifneq ($(CONFIG_HAVE_DEC_LOCK),y)
endif

obj-$(CONFIG_BITREVERSE) += bitrev.o
obj-$(CONFIG_RATIONAL) += rational.o
obj-$(CONFIG_CRC_CCITT) += crc-ccitt.o
obj-$(CONFIG_CRC16) += crc16.o
obj-$(CONFIG_CRC_T10DIF)+= crc-t10dif.o
Expand Down
62 changes: 62 additions & 0 deletions trunk/lib/rational.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* rational fractions
*
* Copyright (C) 2009 emlix GmbH, Oskar Schirmer <os@emlix.com>
*
* helper functions when coping with rational numbers
*/

#include <linux/rational.h>

/*
* calculate best rational approximation for a given fraction
* taking into account restricted register size, e.g. to find
* appropriate values for a pll with 5 bit denominator and
* 8 bit numerator register fields, trying to set up with a
* frequency ratio of 3.1415, one would say:
*
* rational_best_approximation(31415, 10000,
* (1 << 8) - 1, (1 << 5) - 1, &n, &d);
*
* you may look at given_numerator as a fixed point number,
* with the fractional part size described in given_denominator.
*
* for theoretical background, see:
* http://en.wikipedia.org/wiki/Continued_fraction
*/

void rational_best_approximation(
unsigned long given_numerator, unsigned long given_denominator,
unsigned long max_numerator, unsigned long max_denominator,
unsigned long *best_numerator, unsigned long *best_denominator)
{
unsigned long n, d, n0, d0, n1, d1;
n = given_numerator;
d = given_denominator;
n0 = d1 = 0;
n1 = d0 = 1;
for (;;) {
unsigned long t, a;
if ((n1 > max_numerator) || (d1 > max_denominator)) {
n1 = n0;
d1 = d0;
break;
}
if (d == 0)
break;
t = d;
a = n / d;
d = n % d;
n = t;
t = n0 + a * n1;
n0 = n1;
n1 = t;
t = d0 + a * d1;
d0 = d1;
d1 = t;
}
*best_numerator = n1;
*best_denominator = d1;
}

EXPORT_SYMBOL(rational_best_approximation);

0 comments on commit f054f4f

Please sign in to comment.