C语言 将int型转换为float型会导致不正确的值(虽然不是通常的十进制舍入错误)



出于某种原因,我在将整数转换为浮点数(在Arduino上使用c(-ish))时得到了一些非常意想不到的结果。
在过去,我在arduino上遇到过内存问题,所以这可能是一个有用的故障排除提示或转移注意力....你的选择。

无论如何,这是我的代码(只有相关部分),并且给出的值是"6/8",这应该导致meterValue = 0.75:

我的函数:

int getIntegerFromFileStream(File f, char* previewedChar) {
    int num = 0;
    while (48 <= *previewedChar && *previewedChar <= 57) {
        // Ascii range 48-57 represents digits 0-9
        num = (num*10) + atoi(previewedChar);
        *previewedChar = f.read();
    }
    Serial.print(F("Found integer: "));
    Serial.println(num);
}

主代码:

[.... rest of my code ....]    
// Get the value for the meter from the fractional form (ex: 4/4 or 6/8)    
meterValue = (float)getIntegerFromFileStream(file, &inputChar);    
Serial.print(F("New meter value: "));    
Serial.println(meterValue);    
if (inputChar == '/') {    
    inputChar = file.read(); // move past the '/'    
    meterValue /= (float)getIntegerFromFileStream(file, &inputChar);    
    Serial.print(F("New meter value: "));    
    Serial.println(meterValue);    
}    
[.... rest of my code ....]
下面是上面代码的输出:

找到整数:6
新仪表值:3.00
找到整数:8
新仪表值:1.00
新仪表值:1.00

从输出中可以看到,整数本身正在被正确解析,但是一旦它离开函数并被强制转换为浮点数,它的值就会改变(而不是通常的浮点数-小数错误方式)。
任何提示将不胜感激!

编辑:

发现我的新错误:我没有一个返回值为我的getInt函数,所以它是导致未定义的行为。
事实证明,默认情况下,Arduino在编译期间不会给出警告,除非您专门进入Preferences并打开编译的"详细"输出。一旦设置好,我就能看到这些警告了。(这只是现在编辑的,因为我对stackoverflow太新了,还不能回答我自己的问题,我将在我的时间限制结束后回答)

发现我的新错误:我没有一个返回值为我的getInt函数,所以它导致未定义的行为。
事实证明,默认情况下,Arduino在编译期间不会给出警告,除非您专门进入Preferences并打开编译的"详细"输出。设置好之后,我就可以看到这些警告了

最新更新