Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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+中的float函数+;_C++_Performance_Parsing - Fatal编程技术网

C++ 解析C+中的float函数+;

C++ 解析C+中的float函数+;,c++,performance,parsing,C++,Performance,Parsing,我的问题是关于6502在 [ 解析他发布的Float方法很快,但在大的双精度值上并没有给出正确的结果 输入: 132.12345645645 输出: 132.123 double-parseFloat(const-std::string和input){ const char*p=input.c_str(); 如果(!*p |*p=='?') 返回NAN_D; int s=1; 而(*p='')p++; 如果(*p=='-'){ s=-1;p++; } 双acc=0; 当(*p>='0'&&*p=

我的问题是关于6502在 [ 解析他发布的Float方法很快,但在大的双精度值上并没有给出正确的结果

输入:

132.12345645645

输出:

132.123

double-parseFloat(const-std::string和input){
const char*p=input.c_str();
如果(!*p |*p=='?')
返回NAN_D;
int s=1;
而(*p='')p++;
如果(*p=='-'){
s=-1;p++;
}
双acc=0;

当(*p>='0'&&*p='0'&&*p使用cout打印结果时,请确保设置了必要的精度:

cout.precision(20);

但是,正如您所指出的,更简单的方法是:

double string_to_double( const std::string& s )
 {
   std::istringstream i(s);
   double x;
   if (!(i >> x))
     return std::numeric_limits<double>::quiet_NaN(); // Or anything you prefer
   return x;
 }
双字符串到双字符串(const std::string&s)
{
std::istringstream i(s);
双x;
如果(!(i>>x))
返回std::numeric_limits::quiet_NaN();//或任何您喜欢的内容
返回x;
}

注意:由于舍入错误,超过位数可能不会在最右边部分产生100%的预期结果。

小数点后数字的缩放比无用的要严重得多

0.1
相乘是一个错误。这不仅仅是因为
0.1
不是用二进制浮点精确表示的。因此,在循环中,反复用
0.1
相乘会积累越来越多的错误

对于较大的数字,将目前为止的数字乘以10,再加上下一个数字值,将累积更多的错误:-(

诀窍是将数字累加为
无符号long-long
(假设至少为64位),忽略
,但计算其后面的位数。当您拥有所有数字时,浮点整数,然后除以所需的10次方。现在您最多有一个舍入(在浮点数中,如果值超过53位)和除法中的第二位。但是,事情可能会变得复杂……如果某个数字的值超过了
无符号长整数中所能容纳的值,则需要停止添加数字(和四舍五入)…如果在
之前发生这种情况,则需要将其数字相加,然后乘以10的幂


NB:在一般情况下,十进制到二进制浮点的转换是困难的。如果你转换的是没有指数的数字,并且位数是合理的,也不算太糟糕。困扰你的问题是如何创建10的大幂乘除,而不引入(不可接受)错误。

或者旧的呢?至少它们是正确的。在某些情况下,速度可能是好的,但总有一个折衷,在这种情况下,它可能是速度与正确性。很可能你只是混淆了解析的数字和打印的输出。出于某种原因,只打印三个小数。但是这种方法与strodal相比快10倍。所以请记住,在计算机上使用浮点数进行多个计算时,会出现舍入误差,并且随着计算次数的增加,舍入误差会变得更大。至于速度的增加,您测量过吗?如果输入无效怎么办?例如,如果字符串无效,会发生什么情况t数字?或例如
“-a”
?或结尾包含非数字值?所有这些情况都在标准函数中得到正确处理,而此函数可能会以未定义的方式失败。如果出现错误,最好
抛出
(而不是返回有效值
0
)。我同意,或者类似的NaN(不确定OP的代码中如何实现
nanu D
)这个方法是否足够快,或者还有其他更好的选择吗?@ USER 375 6606,你可以对这个代码和你的版本进行基准测试,我不知道哪一个更快,但是肯定你也应该考虑可接受的错误阈值,也可能考虑其他人已经注意到的错误处理能力。最后做一个大除法。
double string_to_double( const std::string& s )
 {
   std::istringstream i(s);
   double x;
   if (!(i >> x))
     return std::numeric_limits<double>::quiet_NaN(); // Or anything you prefer
   return x;
 }