Я работаю на arduino с затмением. Я хочу преобразовать двойной массив char для хранения в EEPROM. Из другого вопроса я нашел ответ на эту проблему. Я изменил его, чтобы удовлетворить мои потребности. Но число, которое я возвращаю, не совсем то же самое.Напишите двойной EEPROM
Код:
#include "Arduino.h"
#include "EEPROM.h"
char finalArray[8];
double final;
double d;
int main(void)
{
init();
setup();
for (;;)
loop();
return 0;
}
void setup() {
Serial.begin(115200);
d = 557.254;
char* byteArray = reinterpret_cast<char*>(&d);
for(int i=0;i<8;i++){
EEPROM.write(i,byteArray[i]);
}
for(int i=0;i<8;i++){
finalArray[i]=EEPROM.read(i);
}
}
void loop() {
final = *reinterpret_cast<double*>(finalArray);
double diff=d-final;
final+=diff;
Serial.println(d,9);
Serial.println(diff,9);
Serial.println(final,9);
delay(1000);
}
В терминале я получаю значение 958.25402
вместо 958.25400
. И если я попрошу 9 десятичных цифр при печати, вместо 5, я получу номер 958.254028320
. Какое решение?
Serial.print дают цифры:
557.254028320
0.000000000
557.254028320
Так что проблема при инициализации двойной д.
Если вы вставляете 'printf (" d =% .17g. \ N ", d);' сразу после 'd = 958.254;', какой результат вы получаете? Если в цикле записи вы вставляете 'printf (« byteArray [% d] =% # x. \ N ", i, (unsigned char) byteArray [i]);', какой результат вы получаете? Если в считываемом цикле после каждого чтения вы вставляете 'printf (« finalArray [% d] =% # x. \ N ", i, (unsigned char) finalArray [i]);', какой результат вы получаете ? Это то же самое, что и исходные байты? –
, когда меня интересует чтение, не печатая номер причины, которую я хочу использовать, для вычислений, поэтому в основном мне не нужно исправлять печать, но возвращаемое число. Я исправил код, и я дам вам результат, чтобы понять проблему. Проблема начинается с двойного d, который я даю. – kyrpav