我正在进行操作的基准测试任务(在Linux下的C语言中),在这个操作中我们使用从字符串到双倍的转换(使用atof或sscanf函数)但这里的问题是他们给出了相对较长的时间(分别为145,270 ns),不适合操作。那么,你知道其他任何可以节省时间的转换机制吗?
我尝试使用强制转换,但它给出了零
double d;
char ch[] = "123.154";
d = *((double *) ch);
printf ("%lf\n", d); // result 0 (compiled using gcc)
此致
答案 0 :(得分:2)
atof()
和sscanf()
是接受各种格式的通用方法。如果您知道浮点值遵循某种模式,则可以尝试优化预期格式的转换。即。无需支持(+ - ),无需支持Inf,Nan或sci-notation(1.3e43)等。
可以创建一个从字符串一次转换3个字符的查找表: 表[a * 256 + b * 16 + c] = a * 100 + b * 10 + c;其中一个简单地连接例如4个LSB位。字符串“432”;索引的十六进制值将是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个字符继续进行组合来结合这些技术。
答案 1 :(得分:0)
double d;
char ch[] = "123.154";
d = atof(ch);
printf ("%f\n", d);
或者:
printf ("%s\n", ch);