我和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的初始化上。
答案 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;