Go Down

Topic: Estoy perdiengo datos de double a string (Read 293 times) previous topic - next topic

jorgetesla

Feb 17, 2020, 07:23 pm Last Edit: Feb 17, 2020, 07:55 pm by jorgetesla
Hola buenas tardes estoy adquiriendo coordenadas a travez de un GPS con una precicion de flotantes de 8 digitos decimales:

Code: [Select]
 
if (Gget.Gps_Location[0] !=0 ){
        double result =  ((Gget.Gps_Location[0]) * (-1)); //le quito el valor negativo
        Serial.println(result,8);                                       //hago una impresion el cual sin problemas me manda 8 digitos decimales
        uint32_t result2 = ((result)*(10000000));
        Serial.println(result2);
        Serial.println("");
        Serial.println("Testing String: ");
        char Cdata [13];                                              // aqui empiezo la operacion de pasar de double a string
        dtostrf(result,4,8,Cdata);
        Serial.println("Cdata: " + String(Cdata));           //imprimo los valor pero me los manda solo con 5 digitinos decimales
        for (int i = 0; i <= 13; i++){
            Serial.print("\t");
            Serial.print(Cdata[i]);
        }
    }




https://ibb.co/BL6bL0g


1 es el valor de gps
2 el valor convertido sin signo
3 multiplicado por 10000000 para quitarle el signo pero solo me permite obtener 7 digitos decimales, si le pongo mas se desvorda
4 es el valor convertido a String donde pierdo los decimales me da solo 5 y yo le puse que 8

surbyte


jorgetesla

con todo respeto Surbyte no se si leyo mi post, pero claramente estan declaradas como doubles

surbyte

Tienes razón. No vi la parte del código donde lo haces.

Code: [Select]
double result =  ((Gget.Gps_Location[0]) * (-1)); //le quito el valor negativo

Respondo a tu problema
Usas uint32_t o sea entero SIN SIGNO y como pretendes que te muestre un valor con signo cuando justamente no lo puede representar.

harkonnen

El valor que quieres poner dentro de una variable float no cabe, por eso se desborda cuando multiplicas por 100000000; el numero de decimales + parte entera es un numero de digitos que es fijo y depende de si es float o double.
Ademas, en arduino UNO float y double es lo mismo.
En otros micros como esp o due, double si que puede contener números más grandes o más pequeños.

Aun así, no se para que quieres presentar un real de esa forma...

Esto funciona en esp8266(no probé en UNO), pero tienes que usar un entero de 64 bits.

Code: [Select]

double result = -108.97846221;
result = fabs(result); // valor absoluto, sin signo
uint64_t result1 = result * 100000000;  // Se almacena el resultado en un entero unsigned long long


La mala noticia es que Serial.println no entiende estos números.
Te hará falta una función que pase de uint64_t a String, si quieres imprimirlo:

Code: [Select]

String uint64ToString(uint64_t input) {
  String result = "";
  uint8_t base = 10;

  do {
    char c = input % base;
    input /= base;

    if (c < 10)
      c +='0';
    else
      c += 'A' - 10;
    result = c + result;
  } while (input);
  return result;
}

void setup() {
  Serial.begin(115200);
  double result = -108.97846221;
  result = fabs(result);
  uint64_t result1 = result * 100000000;
  Serial.println(uint64ToString(result1));
 
}

void loop(){
}




Imprime:10897846221

Saludos.

jorgetesla


Go Up