C ++:atof()有错误的行为

时间:2013-07-19 09:27:58

标签: c++ std atof

我正在使用一个库将Wavefront .obj文件加载到我的OpenGL应用程序(tinyobjloader)中。我注意到加载对象时出错。当我加载一个坐标为例如的对象时。 0.9999999它被设置为0.通过调试我发现以下方法产生这种行为:

static inline float parseFloat(const char*& token)
{
    token += strspn(token, " \t");
    float f = (float)atof(token);
    token += strcspn(token, " \t\r");
    return f;
}

所以atof()以某种方式返回一个int,而不是一个float。我读到一些编译器在使用atof()而不包含“stdlib.h”时不会发出警告,结果是atof()返回一个整数。

奇怪的是,即使我包含“stdlib.h”,错误仍然存​​在。我无法弄清楚导致这种行为的原因。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

标准对此说:

  

除了出错的行为外,它相当于   的strtod(NPTR,(焦炭**)NULL)

所以你的回复'0'与浮动无法代表它或类似的东西无关。

你会使用strtod(你可能应该在stringstreams不是一个选项时,只是为了能够报告错误),那么你可能会注意到它停止在.解析。

这强烈表明您正在使用等待,而不是.作为小数点分隔符的区域设置。根据应用程序如何使用区域设置,您可能希望使用正确设置的环境变量(例如LC_NUMERIC=C)运行它,或者在进行任何解析之前自己执行setlocale(LC_NUMERIC,"C");

在任何情况下,您都应该分析应用程序中的哪些人正在使用与语言环境相关的内容,以及为什么不与它们发生冲突。另一种可能的途径是在任何地方都需要依赖于语言环境的输入,因此每个人都需要以,作为小数分隔符给出数字。

答案 1 :(得分:0)

您可以查看atof here的文档。某些浮点数不能用32位表示,因此您得到一个错误,返回的值为零。

//Try these 
float f = 0.9999999 ;
cout << atof("0.9999999") << " " << f << endl;//output is 1 1 

所以你所看到的是一种有效的行为。 您可以尝试strtod()