解析c++中的float函数
Parsing float function in C++
我的问题是关于6502上发布的解决方案[c++ stringstream太慢,如何加速?]解析Float方法由他发布是快速的,但它不能给出正确的结果大双精度值。
输入:132.12345645645645输出:132.123
double parseFloat(const std::string& input){
const char *p = input.c_str();
if (!*p || *p == '?')
return NAN_D;
int s = 1;
while (*p == ' ') p++;
if (*p == '-') {
s = -1; p++;
}
double acc = 0;
while (*p >= '0' && *p <= '9')
acc = acc * 10 + *p++ - '0';
if (*p == '.') {
double k = 0.1;
p++;
while (*p >= '0' && *p <= '9') {
acc += (*p++ - '0') * k;
k *= 0.1;
}
}
if (*p) die("Invalid numeric format");
return s * acc;
}
我想知道是否有办法改变这个函数来得到正确的结果。
如果使用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;
}
注意:由于舍入错误,超过最右边的位数可能无法产生100%的预期结果
对小数点后的数字进行缩放是非常糟糕的。
乘以0.1
是一个错误…尤其是因为0.1
不能精确地用二进制浮点数表示。因此,在循环中,反复乘以0.1
会积累越来越多的误差。
对于大数,当将目前的数字乘以10,并加上下一个数字的值时,您将累积更多的错误:-(
技巧是将这些数字累加为unsigned long long
(假设至少有64位),忽略.
,但计算它之后的位数。当你有了所有的数字,浮点整数,然后除以所需的10的幂。现在你最多有一次四舍五入(在浮点数中,如果你有超过53位的值),除法中有第二次。但是,事情可能会变得复杂……如果你有一个数字的值超过了unsigned long long
可以容纳的范围,你需要停止添加数字(和四舍五入)…如果发生在.
之前,您需要数到它的数字,然后乘以10的幂。
NB:一般情况下,十进制到二进制的浮点转换是硬的。如果您正在转换没有指数的数字,并且位数是合理的,那么它不是太糟糕。困扰您的问题是如何在不引入(不可接受的)错误的情况下创建10的大幂来乘/除。
相关文章:
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 如何在函数中将字符串和分数存储为(Int 或 float)
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- DirectX :: XMVector函数XMVectorSetByIndex()未设置Float(C )
- 为什么 std::numeric_limits<float>::min() 在流式传输到具有不同函数的输出时行为不同?
- C++ 错误:不存在从 "math::Vec3<float>" 到 "float" 的合适转换函数
- 为什么主函数不识别其他功能是否返回float类型编号
- 没有匹配函数来调用 std::vector<float>
- 您是否需要析构函数来销毁全局 int、float 或 std::string 变量
- 有没有像"int"或"float"这样的函数,但对于素数?
- 如何使用程序集获取返回float的__stdcall函数的结果
- 函数重载中的int和float
- 没有模板函数自动从' int '转换为' float '
- 解析c++中的float函数
- 为什么float在使用模板和标准函数时被提升为double
- 错误 C2084:函数'float cbrt(float) throw()'已具有主体
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 为什么float参数适合int函数参数
- 调用"事件:<float>:通知(NULL, const double&)"没有匹配函数|
- OpenCV SVM 教程?Mat_<float>(1,2) 的函数定义在哪里