我在STM32F437VI上编写了嵌入式c。在某些时候,我需要将一些包含数字的字符串解析为 float 。我使用 atof,它总是能产生正确的结果,除了这个奇怪的情况。如果字符串是 0 或 0.0,则给出 2。
我已经包含了 stdlib.h ,甚至尝试 (float)atof() 进行类型转换,但由于某些奇怪的原因,float 变量始终具有来自 atof("0") 操作的值 2,而 double 值具有正确0。 为什么会发生这种情况?提前谢谢大家。
#include "stdio.h"
#include "stdlib.h"
int main(void)
{
char test[] = "0";
float val1;
double val2;
val1 = atof(test);
val2 = atof(test);
return 0;
}
我预计 float 变量也能得到明显的 0 结果,但它不断获得固定的 2 值。
更新: 此代码部分是一个更大项目的一部分,没有必要详细说明该项目。我有带有 LDFLAG 选项的自定义 Makefile
"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".
这会影响这个问题吗?
就 MCV 示例而言,在 main.c 中我有上面的代码部分,并且得到了提到的结果。 有人能想到 atof() 这样做的任何原因吗? 当然,我也使用了在线 c 编译器和完全相同的代码,结果当然是 0。我想如果 stdlib 库出了问题,那么 atof() 也不适用于所有其他情况。但只有“0”时才会失败,并且只有将结果 2 分配给浮点变量时才会失败。
我使用 Ozone 调试器软件实时观察变量。 原因可能是STM32F4 MCU上使用的浮点实现吗?自定义 Makefile 中缺少参数或类似内容?
最佳答案
首先,你的问题缺少 Minimal, Complete, and Verifiable example .
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char test[] = "0";
float val1;
double val2;
val1 = atof(test);
printf("%f\n", val1);
val2 = atof(test);
printf("%f\n", val2);
}
输出:
0.000000
0.000000
<°)))<()
或者您的标准库实现是 fubar。
关于c - atof ("0") 在 float 变量中返回 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54252773/