如何在不使用c ++中的任何API的情况下将字符串(22.123)格式编号转换为浮点变量格式。这只是为了更多地了解内部编码.. thnx
答案 0 :(得分:3)
类似的东西:
double string_to_double(std::string s)
{
int p = 0;
int p_dec = s.length();
double val = 0;
for (int i=0; i<s.length(); ++i)
{
double digit = (double)(s[i] - '0');
if (s[i] == '.') { p_dec = p; }
else { val += digit*powf(10,p--); }
}
val /= powf(10, p_dec);
}
答案 1 :(得分:2)
基本算法,假设1.2e-4
形式没有输入:
(1)读取点前的整数。如果位数是> 16(正常精度为double
),直接将该整数转换为浮点并返回。
(2)读取最多16位数的整数。计算(整数)÷10 位读。在步骤(1)中用整数求和并返回。
这只涉及2个浮点运算:一个+和一个÷,以及一堆整数算术。乘以10的乘法和除法的优点是误差不会不必要地累积。
(要读取16位整数,需要64位整数。)
实际上,您应该使用sscanf(str, "%lf", ...)
,std::istringstream
或boost::lexical_cast<double>
。
答案 2 :(得分:0)
通过使用一系列乘法和除以10的幂来逐位数字,并按字符构造字符串。
答案 3 :(得分:0)
如果您只是想知道如何做,另一个答案是,如果您想要一个准确的结果,问题就不那么简单了,您应该参考有关该主题的文献。例如:ftp://ftp.ccs.neu.edu/pub/people/will/howtoread.ps
答案 4 :(得分:0)
我很确定Plauger标准C图书馆的书中有一张带有strtod源代码的光盘。 http://www.amazon.co.uk/Standard-C-Library-P-J-Plauger/dp/0131315099