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 个字符继续,来组合这些技术。