Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:atof()有错误的行为_C++_Std_Atof - Fatal编程技术网

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

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

我正在使用一个库将Wavefront.obj文件加载到我的OpenGL应用程序()。我注意到加载对象时出错。当我加载坐标为0.999999的对象时,它被设置为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”,错误仍然存在。我想不出是什么导致了这种行为


有什么想法吗?

您可以查看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依赖于语言环境。