У меня есть Arduino, который получает сообщение от моего смартфона (через bluetooth), содержащего временную метку unix. Теперь, я пытаюсь синхронизировать мой DS1307 с этой меткой времени.Странное поведение с atof
Однако это не сработало, поэтому я начал поиск и обнаружил странное поведение при преобразовании массива C-стиля, содержащего метку времени, в число с плавающей точкой.
// Copy the time into "timeBuff"
int timeLength = siz - _CAT_LENGTH_;
char timeBuff[timeLength+1];
memcpy(timeBuff, &msg[_CAT_LENGTH_], timeLength);
timeBuff[timeLength] = '\0';
// For debugging
Serial.print(F("timeBuff: "));
Serial.println(timeBuff);
// Convert timeBuff string into a variable of type long
float deviceTime = atof(timeBuff);
// Now, deviceTime != what we printed above
Serial.print(F("Epoch time: "));
Serial.println(deviceTime);
Первые 5 строк копируют правую часть сообщения в массив символов и добавляет нулевой конечный результат.
Впоследствии мы печатаем содержимое timeBuff
и преобразуем его в float
, который хранится в deviceTime
. Наконец, мы печатаем deviceTime
.
Это был результат моего первого теста
timeBuff: 1476113620
Epoch time: 1476113664.00
И это второй тест
timeBuff: 1476115510
Epoch time: 1476115456.00
Почему результат atof
отличается от строки мы прошли это?
'float' не имеет достаточной точности, чтобы точно представлять значение. – Transcendental
Почему вы имеете дело с 'float' здесь? –
@MichaelWalz Мне нужно синхронизировать мой DS1307 (часы RTC для Arduino), поэтому мне нужно создать 'DateTime', который я передаю методу' adjust' библиотеки. Чтобы создать это 'DateTime', я хотел передать временную метку unix, полученную в сообщении. – HyperZ