0

我正在使用一个库将 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,而不是一个浮点数。我读到有些编译器在使用 atof() 时不包含“stdlib.h”,结果是 atof() 返回一个整数。

奇怪的是,即使我包含“stdlib.h”,错误仍然存​​在。我不知道是什么导致了这种行为。

任何想法?

4

2 回答 2

2

标准对 atof 说:

除了错误时的行为,它等价于 strtod(nptr,(char**)NULL)

所以你的返回 '0' 与不能代表它或类似的浮点数无关。

您是否会使用 strtod 代替(当 stringstreams 不是一个选项时您可能应该使用它,只是为了能够报告错误),那么您可能会注意到它在..

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

在任何情况下,您都应该分析您的应用程序中谁在使用与语言环境相关的东西,以及使用什么,以免与它们发生冲突。另一种可能的方法是在任何地方都需要依赖于语言环境的输入,因此每个人都需要将数字,作为小数分隔符提供给您。

于 2013-07-19T10:22:04.400 回答
0

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

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

所以你看到的是一个有效的行为。你可能想试试strtod ()

于 2013-07-19T09:37:15.937 回答