C atof(“0”)在浮点变量中返回2

C atof(“0”)在浮点变量中返回2,c,embedded,stm32f4,atof,C,Embedded,Stm32f4,Atof,我在STM32F437VI上编写嵌入式c。在某些时候,我需要解析一些包含数字的字符串,比如浮点数。我使用atof,它总是以正确的结果工作,除了这个奇怪的例子。如果字符串为0或0.0,则为2 我已经包含了stdlib.h,甚至尝试(float)atof()进行类型转换,但出于某种奇怪的原因,float变量始终具有atof(“0”)操作中的值2,而double值具有正确的0。 为什么会这样?提前谢谢大家 #include "stdio.h" #include "stdlib.h" int main

我在STM32F437VI上编写嵌入式c。在某些时候,我需要解析一些包含数字的字符串,比如浮点数。我使用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;
}
我希望浮点变量也会得到明显的0结果,但它会一直得到固定的2值

更新: 此代码部分是一个更大项目的一部分,没有必要详细说明该项目。我有带有LDFLAG选项的自定义Makefile

"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".
"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".
这会影响这个问题吗

就MCV示例而言,在main.c中,我有上面的代码部分,并且得到了上面提到的结果。 有人能想出atof()这样做的原因吗? 当然,我也使用了在线c编译器和完全相同的代码,结果当然是0。我想,如果stdlib库出现了非常严重的问题,那么atof()就不能适用于所有其他情况。但它仅在“0”时失败,并且只在将结果2分配给float变量时失败

我用Ozone调试器软件实时观察变量。
原因可能是使用了STM32F4 mcu上的浮点实现吗?自定义Makefile中缺少参数或类似的内容?

首先,您的问题缺少一个参数


问题的原因似乎在更新的问题文本中:

更新:此代码部分是一个更大项目的一部分,没有必要详细说明该项目。我有带有LDFLAG选项的自定义Makefile

"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".
"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".
假设这些选项是更改而不是默认值,那么您要做的是告诉编译器为不同于工具链库生态系统的ABI生成代码。为
main
生成的代码需要浮点寄存器中的
atof
结果,但
atof
使用标准ABI,它在通用寄存器中传递浮点参数和返回值。因此,
main
只是读取浮点寄存器中用于返回值的垃圾


如果删除
-mfloat abi=hard
,查看问题是否消失。如果是这样,你可能已经发现了你的问题。您需要为硬浮点ABI构建一个工具链和库,或者坚持默认的非硬浮点调用约定。

根据您展示的代码,我们将无法复制您的问题。请尝试创建一个来向我们展示。您的工具链是否有可配置的浮点支持?此外,一些工具链允许禁用
scanf
库函数的更复杂功能,也可能会影响
ato*
strto*
函数。“我的代码在这里显示得太大”的答案是MCVE。“太秘密”的答案是MCVE。如果您只显示您猜测问题所在的代码行,但您自己却没有发现,那么很可能错误在其他地方。做一个MCVE,确保你和我们看的是同一件事。如果我们不能复制它,那么是时候讨论编译器版本和环境的其他属性了。阅读一些人提供的MCVE链接,并将该概念应用到您的代码中。在没有MCVE的情况下询问感知到的不当行为是离题的。如果您展示的内容足以让您复制问题,则将其放入
main
函数中,添加头文件,并使其完整。然后告诉我们,这是复制问题的最小代码(当然,请确保您确实可以使用该程序进行复制),并添加有关生成和运行设置及环境的所有详细信息。您的新代码不使用由
atof
返回的值。编译器可以优化变量分配。调试器可能没有显示实际值。你应该试着打印结果,看看你得到了什么。