c - atof ("0") 在 float 变量中返回 2

标签 c embedded stm32f4 atof

我在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/

相关文章:

struct - 读/写结构到闪存

c - STM32 HAL SPI 16 位发送

c编程,创建存储指针的动态数组,struc

c - 如何从字符串中提取指定字符串

c - 如果以下代码中没有 "volatile"关键字,编译器可以执行什么优化?

java - 在不使用 JNI 的情况下从 Java 调用 native 函数(使用堆栈操作)

c - 从内联字节重新组装 float

c - makefile,工作正常,但即使没有更改也可以运行命令

c++ - 将函数的返回值存储到指向 char 变量的指针中是正确的做法吗?

stm32f4 - Openocd如何将选项字节写入STM32F4