我在 arduino 使用 eclipse 工作。我想将 double 组转换为字符数组以存储到 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.2540000000000190993887372314929962158203125。
如果代码如您在此处所示,则您的编译器不正确支持 double
(C 和 C++ 标准要求十位十进制数字可以转换为 double
并再次返回而不更改十进制数字)。
对于合理性测试,您应该在分配后立即打印d
。代码中可能存在一些“有趣的事情”,稍后会更改 d
的值。如果 d = 958.254;
导致 d
的值为 958.2540283203125,那么您应该调查编译器对 64 位 float 的支持。如果 d
是 958.2540000000000190993887372314929962158203125 并且稍后发生更改,那么您应该调查程序中的错误。
关于c++ - 将 double 写入 EEPROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657204/