在EEPROM中写入一个double
Write a double to EEPROM
我在arduino使用eclipse。我想把一个double-to-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的初始化上。
值958.2540283203125是将958.254
转换为float
(特别是转换为IEEE-754 32位二进制浮点值)的结果。将其转换为double
(64位)应产生958.254000000000019099388737231492962158203125。
如果代码如您所示,则说明您的编译器不正确支持double
(C和C++标准要求十位数的十进制数字可以转换为double
,然后再转换回来,而不更改十进制数字)。
对于健全性测试,应在分配d
之后立即打印。代码中可能有一些"有趣的事情",稍后会更改d
的值。如果d = 958.254;
导致d
的值为958.2540283203125,那么您应该研究编译器对64位浮点的支持。如果d
是958.254000000000019099388737231492962158203125,并且稍后发生更改,那么您应该调查程序中的错误。
你试过吗
d = 557.254000000d;
相关文章:
- 在c++中为double类型的数组创建一个unique_ptr
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 错误:"int pow(double,int)"与上一个声明int pov(double a,int
- 分配一个(固定大小)矢量<矢量<double>>以便高效访问并添加它们?
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 使用 std::uniform_real_distribution 初始化一个 N 大小的 std::vector<double>
- 如何在c++中将计算分解为两个double和一个char
- 一个关于C++中double和int之间转换的奇怪结果
- 舍入一个double并通过XML-RPC发送
- 为什么双空大括号 { { } } 创建一个<double>包含一个元素而不是零元素的 std::initializer_list?
- 如何创建一个通用指针,它可以处理int和double变量并避免范围问题
- 如何将"double*"传递给类函数,并将该值应用于该类中的另一个"double*"
- 在QT中,是否有一个用于double、float、int等的动态数组.即QDoubleArray
- 在EEPROM中写入一个double
- 在Visual Studio中使用__asm在浮动堆栈中返回一个double
- 为什么两个程序中的一个会导致错误"*** glibc detected *** double free or corruption"而另一个则不会导致错误?
- 如何在删除一个元素(double for循环)后正确地指向std::list
- 将一个short类型数组转换为double类型数组
- 输出一个写在二进制文件c++中的double
- 一个如何实现string和long, int, double模板函数的建议