C++ C++;:atof()有错误的行为
我正在使用一个库将Wavefront.obj文件加载到我的OpenGL应用程序()。我注意到加载对象时出错。当我加载坐标为0.999999的对象时,它被设置为0。通过调试,我发现以下方法会产生这种行为:C++ C++;:atof()有错误的行为,c++,std,atof,C++,Std,Atof,我正在使用一个库将Wavefront.obj文件加载到我的OpenGL应用程序()。我注意到加载对象时出错。当我加载坐标为0.999999的对象时,它被设置为0。通过调试,我发现以下方法会产生这种行为: static inline float parseFloat(const char*& token) { token += strspn(token, " \t"); float f = (float)atof(token); token += strcspn(t
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”,错误仍然存在。我想不出是什么导致了这种行为
有什么想法吗?您可以查看atof的文档。有些浮点不能用32位表示,因此您将得到一个错误,返回的值为零
//Try these
float f = 0.9999999 ;
cout << atof("0.9999999") << " " << f << endl;//output is 1 1
//试试这些
浮点数f=0.9999999;
标准对atof说:
除错误行为外,它相当于
strtod(nptr,(字符**)NULL)
因此,返回“0”与无法表示它或类似值的浮点无关
如果您使用strtod(当stringstreams不是一个选项时,您可能应该这样做,以便能够报告错误),那么您可能会注意到它在
处停止解析
这强烈表明您正在使用等待,
的区域设置,而不是将
用作小数点分隔符。根据应用程序与区域设置的工作方式,您可能希望使用正确设置的环境变量(例如,LC_NUMERIC=C
)运行应用程序,或者执行setlocale(LC_NUMERIC,“C”)在进行任何解析之前,请先编写代码>自己
在任何情况下,您都应该分析应用程序中谁在使用依赖于语言环境的东西,以及这些东西的用途,以免与它们发生冲突。另一种可能的方法是在任何地方都需要依赖于语言环境的输入,因此每个人都需要使用,
作为十进制分隔符向您提供数字。确保使用gcc-Wall…
(或等效工具,即启用警告)进行编译。为什么不使用std::istringstream?这是一个外部库。这就是我不使用std::stringstream的情况。什么是编译器、操作系统、版本?以及“09999999”在这两种情况下如何-atof()和strod()-我的第一个输出都是零。根据标准(关于atof):“除了错误行为,它相当于strod(nptr,(char**)NULL)
”,因此它必须进行解析和取整,不返回0。@TimV:有没有可能是strtod期望的,而不是。?有些东西不是完全可以表示的,但这不是0.9999999成为的借口0@TimV当前位置这不是问题所在。我在问你的斯特罗德是否期望。。试试看。strod依赖于语言环境。