DGtal 1.4.0
Loading...
Searching...
No Matches
approximation.cpp File Reference
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <iomanip>
#include "DGtal/arithmetic/LighterSternBrocot.h"
#include "DGtal/base/StdRebinders.h"
Include dependency graph for approximation.cpp:

Go to the source code of this file.

Functions

void usage (int, char **argv)
 
int main (int argc, char **argv)
 

Detailed Description

Author
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
Date
2012/02/06

An example file named approximation.

This file is part of the DGtal library.

Definition in file approximation.cpp.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Main.

[approximation-types]

[approximation-types]

[approximation-process]

[approximation-process]

Definition at line 73 of file approximation.cpp.

74{
75 if ( argc < 2 )
76 {
77 usage( argc, argv );
78 return 1;
79 }
80
82 typedef DGtal::int64_t Integer;
83 typedef DGtal::int64_t Quotient;
84 typedef LighterSternBrocot<Integer, Quotient, StdMapRebinder> SB; // the type of the Stern-Brocot tree
85 typedef SB::Fraction Fraction; // the type for fractions
86 typedef std::back_insert_iterator< Fraction > OutputIterator;
88
90 long double epsilon = 1e-14;
91 long double number0 = strtold( argv[ 1 ], 0 );
92 long double number = number0;
93 ASSERT( number >= 0.0 );
94 Fraction f;
95 OutputIterator itback = std::back_inserter( f );
96 Quotient i = 0;
97 while ( true )
98 {
99 long double int_part = floorl( number );
100 Quotient u = NumberTraits<long double>::castToInt64_t( int_part );
101 *itback++ = std::make_pair( u, i++ );
102 long double approx =
103 ( (long double) NumberTraits<Integer>::castToDouble( f.p() ) )
104 / ( (long double) NumberTraits<Integer>::castToDouble( f.q() ) );
105 std::cout << "z = " << f.p() << " / " << f.q()
106 << " =~ " << std::setprecision( 16 ) << approx << std::endl;
107 number -= int_part;
108 if ( ( (number0 - epsilon ) < approx )
109 && ( approx < (number0 + epsilon ) ) ) break;
110 number = 1.0 / number;
111 }
112 std::cout << "z = " << f.p() << " / " << f.q() << std::endl;
114 return 0;
115}
Aim: The Stern-Brocot tree is the tree of irreducible fractions. This class allows to construct it pr...
boost::int64_t int64_t
signed 94-bit integer.
Definition BasicTypes.h:74
Aim: The traits class for all models of Cinteger.

◆ usage()

void usage ( int ,
char ** argv )

Definition at line 64 of file approximation.cpp.

65{
66 std::cerr << "Usage: " << argv[ 0 ] << " <floating point number>" << std::endl;
67 std::cerr << "\t - computes the successive rational approximation of this number, up to a precision of 1e-14." << std::endl;
68}