atof(“ 0”)在float变量中返回2

时间:2019-01-18 11:11:00

标签: 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(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分配给float变量。

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

2 个答案:

答案 0 :(得分:3)

首先,您的问题缺少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。

答案 1 :(得分:1)

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

  

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

"-mfloat-abi=hard -mfpu=fpv4-sp-d16 -u _printf_float".

假设这些选项是对默认值的更改,那么您正在执行的操作是告诉编译器为工具链的库生态系统中不同的ABI生成代码。为main生成的代码在浮点寄存器中期望atof的结果,但是atof使用的是标准ABI,该ABI传递浮点参数并在通用寄存器中返回值。因此,main只是在读取用于返回值的浮点寄存器中剩下的所有垃圾。

如果删除-mfloat-abi=hard,请查看问题是否消失。如果是这样,您可能已经找到了问题。您需要为hardfloat ABI构建工具链和库,或者坚持使用默认的非hardfloat调用约定。