1

我正在为一个操作(在 Linux 下用 C 语言)做一个基准测试任务,在这个操作中,我们使用了从字符串到 double 的转换(使用 atof 或 sscanf 函数),但这里的问题是它们给出了一个相对较大的时间(分别为 145、270 ns),这不适合该操作。那么,您知道任何其他可以节省时间的转换机制吗?

我尝试使用强制转换,但它给了零

double d;

char ch[] = "123.154";

d = *((double *) ch);

printf ("%lf\n", d);         // result 0 (compiled using gcc)

问候

4

2 回答 2

2

atof()并且sscanf()是接受多种格式的通用方法。如果您知道浮点值遵循某种模式,您可以尝试针对预期格式优化转换。IE。无需支持 (+-),无需支持 Inf、Nan 或 sci-notation (1.3e43) 等。

可以制作一个从字符串一次转换 3 个字符的查找表: table[a*256+b*16+c] = a*100+b*10+c; 其中一个简单地连接例如字符串“432”的 4 个 LSB 位;索引的十六进制值将是 0x432,内容将是 432。

强制转换意味着改变一些二进制数据的解释。双精度或浮点数和整数不兼容二进制((+) 0 的值除外)。但是,以下演员可以检查字符串中的前三个字符是否为数字:

 char num[]="123.123";
 if ((*((int*)num) & 0x00f0f0f0) == 0x00303030) // can use faster conversion

 // this means interpreting the pointer to string as a pointer to integer
 // and then referencing the contents of the memory _as_ integer (+ some bitmasking)

此外,如果浮点集相对较小,或者某个特定值非常频繁,则可能会以空间换取速度并选择哈希表。如果哈希表匹配,可以并行比较字符串 4 或 8 个字节以进行验证(或跳过该部分,如果已知输入有效)。人们还可以通过对前 4 个字符进行散列来进行初始猜测,然后一次从接下来的 4 个字符继续,来组合这些技术。

于 2012-11-05T10:56:11.153 回答
0
double d;
char ch[] = "123.154";
d = atof(ch);
printf ("%f\n", d); 

或者:

printf ("%s\n", ch); 
于 2012-11-05T10:54:58.333 回答