atof をどうしても高速化したくて、桁数を限定すれば高速化できるのではないかと思い、整数部9桁、小数部9桁に限定したものを作ってみました。
9桁というのは int や unsigned int で完全に表現できる最大の桁数です。なるべく整数で演算を行って速度を稼いでいます。
isdigit_fast, pow10n は先に投稿したものを使用しています。
std::atof より 37% 速いという結果が出ています。
実際は 14桁.10桁に対応し、オーバーフローは例外を投げ、さらにコンマをスキップする機能を持ったものを使用しています。
#include "isdigit.h" // isdigit_fast #include "pow10n.h" // pow10n /// 整数部9桁、小数部9桁までの小数点表記(fフォーマット)文字列を double に変換する double atof99(const char* str) { int sign = 1; // 符号 unsigned int u = 0; // 整数部 unsigned int l = 0; // 小数部 int lc = 0; // 小数部桁数 while (*str == ' ') ++str; if (*str == '-') { sign = -1; ++str; } while (isdigit_fast(*str)) { u = u * 10 + *str - '0'; ++str; } if (*str == '.') { ++str; while (isdigit_fast(*str)) { l = l * 10 + *str - '0'; ++lc; ++str; } } return sign * (u + l * double(pow10n(-lc))); }
P.S. lc は小数部桁数の -1倍にした方が neg 1個分速そうな気がしてきた。