¿Cómo puedo imprimir datos float64?

Mediante Python envió varios datos del tipo float64 pero al recibirlos por Arduino, el problema al querer imprimir me sale el error filtro_arduino_uno:19:21: error: call of overloaded 'println(float64_t&) is ambiguous, el problema es que realmente no se utilizar bien la librería fp64lib intente leer la documentación pero no termino de comprender bien como utilizarla.

Código Arduino:

//#include <Float64.h>
#include <fp64lib.h>

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {

    String incomingBytes = Serial.readString();
    char buf[50];
    incomingBytes.toCharArray(buf,50);

    float64_t x =  fp64_atof(incomingBytes.c_str());
    

    Serial.println(x);

  }
}

Librería fp64lib

No habia visto que habías puesto el enlace de la librería y te había regañado pero luego de postear todo lo vi.
Mientras encontré esta que luce similar

En el ejemplo Double.ino no parece haber problemas

/* 
 * Example program for using fp64lib.
 * Leibniz formular to approximate PI using a small C++ wrapper class
 *
 */

#include <fp64lib.h>

class Double {
	public:
		Double()				{ x = 0ULL; }
		Double( double f )		{ x = fp64_sd( f ); }
		Double( float f )		{ x = fp64_sd( f ); }
		Double( int16_t n )		{ x = fp64_int16_to_float64( n ); }
		Double( uint16_t n )	{ x = fp64_uint16_to_float64( n ); }
		Double( const Double& d ) { x = d.x; }
		const char* toString() { 
			return fp64_to_string( x, 17, 15);
			}
		Double operator+=( const Double& y ) {
			this->x = fp64_add( this->x, y.x );
			return( *this );
			}
		Double operator+( const Double& y ) {
			Double res;
			res.x = fp64_add( this->x, y.x );
			return( res );
			}
		Double operator-=( const Double& y ) {
			this->x = fp64_sub( this->x, y.x );
			return( *this );
			}
		Double operator-( const Double& y ) {
			Double res;
			res.x = fp64_sub( this->x, y.x );
			return( res );
			}
		Double operator*=( const Double& y ) {
			this->x = fp64_mul( this->x, y.x );
			return( *this );
			}
		Double operator*( const Double& y ) {
			Double res;
			res.x = fp64_mul( this->x, y.x );
			return( res );
			}
		Double operator/=( const Double& y ) {
			this->x = fp64_div( this->x, y.x );
			return( *this );
			}
		Double operator/( const Double& y ) {
			Double res;
			res.x = fp64_div( this->x, y.x );
			return( res );
			}
		Double operator%=( const Double& y ) {
			this->x = fp64_fmod( this->x, y.x );
			return( *this );
			}
		Double operator%( const Double &y ) {
			Double res;
			res.x = fp64_fmod( this->x, y.x );
			return( res );
			}
   private:
      float64_t x;
};

#define MAX_COUNT   1000    // # of iterations before printing another approximation
Double x = 1.0;
Double n = 3.0;
Double delta = 2;
bool add = false;

void setup() {
	Serial.begin(57600);
	
	Double a = 1;
	Double b;
	Serial.println( "Test for implicit type casting: b = a + 2" );
	Serial.print("a:"); Serial.println( a.toString() );
	b = a + 2;
	Serial.print("b:"); Serial.println( b.toString() );
	Serial.println( "Test for implicit type casting: a += 3" );
	a += 3;
	Serial.print("a:"); Serial.println( a.toString() );
}

void loop() {
	int cnt = 0;

	while(1) {
		if( add )
			x += Double(1.0)/n;
		else
			x -= Double(1.0)/n;
		add = !add;
		if( ++cnt == MAX_COUNT ) {
			Serial.print( n.toString() );
			Serial.print(": ");
			Serial.print( x.toString() );
			Serial.print("\t");
			Double pi = x * 4;
			Serial.println( pi.toString() );
			cnt = 0;
		}
		n += 2;
	}
}
	

La salida por el monitor serie fue esta

a:1
b:3
Test for implicit type casting: a += 3
a:4
2001: 0.785647913584886	3.142591654339544
4001: 0.785523100920881	3.142092403683525
6001: 0.785481468959947	3.141925875839788
8001: 0.785460647775378	3.141842591101513
10001: 0.785448153398947	3.141792613595789
12001: 0.785439823120537	3.141759292482148
14001: 0.785433872581666	3.141735490326665
16001: 0.785429409491561	3.141717637966244
18001: 0.785425938089061	3.141703752356244
20001: 0.785423160897635	3.141692643590538
22001: 0.785420888604197	3.141683554416789
24001: 0.785418994994775	3.141675979979099
26001: 0.78541739268747	3.141669570749881
28001: 0.785416019264861	3.141664077059443
30001: 0.785414828953058	3.141659315812232
32001: 0.785413787420931	3.141655149683724
34001: 0.785412868414788	3.141651473659153
36001: 0.785412051514765	3.14164820605906
38001: 0.785411320599694	3.141645282398777
40001: 0.785410662772473	3.141642651089892
42001: 0.785410067592481	3.141640270369926
44001: 0.785409526517302	3.141638106069208
46001: 0.785409032490092	3.141636129960368
48001: 0.785408579630101	3.141634318520406
50001: 0.785408162997461	3.141632651989843
52001: 0.785407778412252	3.141631113649008
54001: 0.785407422313783	3.14162968925513
56001: 0.785407091650011	3.141628366600044
58001: 0.785406783789851	3.141627135159402
60001: 0.785406496453017	3.141625985812069
62001: 0.785406227653445	3.141624910613781
64001: 0.785405975653322	3.141623902613289
66001: 0.78540573892547	3.141622955701878
68001: 0.785405516122373	3.141622064489494
70001: 0.785405306050522	3.141621224202087
72001: 0.785405107649002	3.141620430596007
74001: 0.785404919971601	3.141619679886402
76001: 0.785404742171696	3.141618968686786
78001: 0.785404573489504	3.141618293958016
80001: 0.785404413241209	3.141617652964835
82001: 0.785404260809714	3.141617043238855
84001: 0.785404115636687	3.141616462546749
86001: 0.785403977215738	3.141615908862951
88001: 0.785403845086509	c

Ahora si comparo con lo que quieres presentar nos encontramos con que los datos llegan por el puerto Serie de modo que hay que convertirlos.
Veré si puedo hacerlo.

Bueno, miré aqui y allá y la solución estaba en los ejemplos.

#include <fp64lib.h>

char *fixedLength( char *s, float64_t x ) {
  // return a string always with the same length, including trailing zeros
  char *t = fp64_to_string( x, 17, 15 );
  sprintf( s, "%s%s00000000000000000", t[0] == '-' ? " " : " ", t );
  s[18] = '\0';
  return s;
}

void setup() {
  Serial.begin(57600);
}

void loop() {
  if (Serial.available()) {

    String incomingBytes = Serial.readString();
    char buf[50];
    incomingBytes.toCharArray(buf,50);
    
    float64_t x =  fp64_atof(buf);
    
    Serial.print( fixedLength( buf, x ) ); 
  }
}
1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.