1

我在 arduino 和 eclipse 一起工作。我想将 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 个,我会得到 number 958.254028320。解决办法是什么?

serial.print 给出数字:

557.254028320

0.000000000

557.254028320

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

4

2 回答 2

4

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

如果代码如您在此处显示的那样,那么您的编译器无法double正确支持(C 和 C++ 标准要求十位十进制数字可以在double不更改十进制数字的情况下相互转换)。

对于健全性测试,您应该在分配后d 立即打印。代码中可能有一些“有趣的事情”改变了dlater 的值。如果d = 958.254;结果d是 958.2540283203125,那么您应该调查您的编译器对 64 位浮点的支持。如果d是 958.2540000000000190993887372314929962158203125 并且稍后更改,那么您应该调查程序中的错误。

于 2013-07-15T16:26:08.003 回答
0

你试过吗

    d = 557.254000000d;
于 2013-07-15T16:00:47.550 回答