gpt4 book ai didi

floating-point - atof 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 15:16:33 26 4
gpt4 key购买 nike

我有一个 Arduino,它从我的智能手机(通过蓝牙)接收一条包含 unix 时间戳的消息。现在,我正在尝试将我的 DS1307 与该时间戳同步。

但是,它不起作用,因此,我开始搜索并在将包含时间戳的 C 样式数组转换为 float 时发现了一些奇怪的行为。

// Copy the time into "timeBuff"
int timeLength = siz - _CAT_LENGTH_;
char timeBuff[timeLength+1];
memcpy(timeBuff, &msg[_CAT_LENGTH_], timeLength);
timeBuff[timeLength] = '\0';

// For debugging
Serial.print(F("timeBuff: "));
Serial.println(timeBuff);

// Convert timeBuff string into a variable of type long
float deviceTime = atof(timeBuff);

// Now, deviceTime != what we printed above
Serial.print(F("Epoch time: "));
Serial.println(deviceTime);

前 5 行将消息的右侧部分复制到字符数组中,并添加终止符零。

然后,我们打印timeBuff 的内容并将其转换为float 存储在deviceTime 中。最后,我们打印 deviceTime

这是我第一次测试的结果

timeBuff:   1476113620
Epoch time: 1476113664.00

这是第二次测试

timeBuff:   1476115510
Epoch time: 1476115456.00

为什么 atof 的结果与我们传递给它的字符串不同?

最佳答案

在大多数平台上,float 以 IEEE-754 单精度格式表示,这是具有 24 位 (23+1) 尾数的 32 位浮点格式。它根本没有足够的精度来表示您的数字。您的数字需要大约 32 位来表示。当存储在 float 中时,大于 24 位的整数值通常会失去精度。

精度的损失将表现为尾随位的丢失,并在最后剩下的位中舍入

1476113620 -> ‭01010111111110111011010011010100‬
1476113664 -> ‭01010111111110111011010100000000‬

关于floating-point - atof 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39960244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com