c++ - 将 double 写入 EEPROM

标签 c++ c optimization terminal arduino

我在 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/

相关文章:

c++ - 函数指针 - 类的内部和外部

c++ - 堆栈对象的延迟初始化?

c - 函数无法返回字符串

c# - 从 C# 调用 C DLL 函数 - 参数结构太大或太复杂而无法编码(marshal)

c - 在 32 位 Open Watcom C 中生成 FAR 跳转指令

c# - 增加线程和进程优先级以减少处理器密集型并行应用程序的执行时间

c++ - 如何模拟方法返回 istream&?

c++ - C++ 获取一天开始时间戳

c++ - 快速排序优化

ruby-on-rails - 提高此服务器代码的性能以查找域?