在EEPROM中写入一个double

Write a double to EEPROM

本文关键字:一个 double EEPROM      更新时间:2023-10-16

我在arduino使用eclipse。我想把一个double-to-char数组转换为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

所以问题出在双d的初始化上。

值958.2540283203125是将958.254转换为float(特别是转换为IEEE-754 32位二进制浮点值)的结果。将其转换为double(64位)应产生958.254000000000019099388737231492962158203125。

如果代码如您所示,则说明您的编译器不正确支持double(C和C++标准要求十位数的十进制数字可以转换为double,然后再转换回来,而不更改十进制数字)。

对于健全性测试,应在分配d之后立即打印。代码中可能有一些"有趣的事情",稍后会更改d的值。如果d = 958.254;导致d的值为958.2540283203125,那么您应该研究编译器对64位浮点的支持。如果d是958.254000000000019099388737231492962158203125,并且稍后发生更改,那么您应该调查程序中的错误。

你试过吗

    d = 557.254000000d;
相关文章: