atof の桁数限定高速版

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個分速そうな気がしてきた。