Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
lib
rational.c
Go to the documentation of this file.
1
/*
2
* rational fractions
3
*
4
* Copyright (C) 2009 emlix GmbH, Oskar Schirmer <
[email protected]
>
5
*
6
* helper functions when coping with rational numbers
7
*/
8
9
#include <
linux/rational.h
>
10
#include <linux/compiler.h>
11
#include <linux/export.h>
12
13
/*
14
* calculate best rational approximation for a given fraction
15
* taking into account restricted register size, e.g. to find
16
* appropriate values for a pll with 5 bit denominator and
17
* 8 bit numerator register fields, trying to set up with a
18
* frequency ratio of 3.1415, one would say:
19
*
20
* rational_best_approximation(31415, 10000,
21
* (1 << 8) - 1, (1 << 5) - 1, &n, &d);
22
*
23
* you may look at given_numerator as a fixed point number,
24
* with the fractional part size described in given_denominator.
25
*
26
* for theoretical background, see:
27
* http://en.wikipedia.org/wiki/Continued_fraction
28
*/
29
30
void
rational_best_approximation
(
31
unsigned
long
given_numerator,
unsigned
long
given_denominator,
32
unsigned
long
max_numerator,
unsigned
long
max_denominator,
33
unsigned
long
*best_numerator,
unsigned
long
*best_denominator)
34
{
35
unsigned
long
n
,
d
, n0,
d0
, n1,
d1
;
36
n = given_numerator;
37
d = given_denominator;
38
n0 = d1 = 0;
39
n1 = d0 = 1;
40
for
(;;) {
41
unsigned
long
t
,
a
;
42
if
((n1 > max_numerator) || (d1 > max_denominator)) {
43
n1 = n0;
44
d1 =
d0
;
45
break
;
46
}
47
if
(d == 0)
48
break
;
49
t =
d
;
50
a = n /
d
;
51
d = n %
d
;
52
n =
t
;
53
t = n0 + a * n1;
54
n0 = n1;
55
n1 =
t
;
56
t = d0 + a *
d1
;
57
d0 =
d1
;
58
d1 =
t
;
59
}
60
*best_numerator = n1;
61
*best_denominator =
d1
;
62
}
63
64
EXPORT_SYMBOL
(
rational_best_approximation
);
Generated on Thu Jan 10 2013 14:55:51 for Linux Kernel by
1.8.2