写一个双倍的EEPROM

时间:2013-07-15 14:52:49

标签: c++ c optimization terminal arduino

我和eclipse在arduino工作。我想将double转换为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的初始化上。

2 个答案:

答案 0 :(得分:4)

值958.2540283203125是将958.254转换为float(具体而言,转换为IEEE-754 32位二进制浮点值)的结果。将其转换为double(64位)应生成958.2540000000000190993887372314929962158203125。

如果代码如您在此处所示,那么您的编译器不能正确支持double(C和C ++标准要求将十位十进制数字转换为double并返回再次不改变小数位数。)

要进行完整性测试,您应在分配后立即打印d 。代码中可能存在一些“有趣的业务”,后来会改变d的值。如果d = 958.254;导致d的值为958.2540283203125,则应调查编译器对64位浮点的支持。如果d为958.2540000000000190993887372314929962158203125并稍后进行更改,则应调查程序中的错误。

答案 1 :(得分:0)

你试过

吗?
    d = 557.254000000d;