8 Ocak 2015 Perşembe

IEEE 754 ve Stringden Okuma

String'den Okuma İşlemleri
Kendi Kodumuz
Diyelim ki string'den okuma için kendi kodumuzu yazmamız gerekti. Şöyle olabilir. Önce tüm sayı nokta dikkate alınmadan okunuyor. 10'un noktanın sağındaki hane kadar üssü alınıyor ve tüm sayı bu değer ile bölünüyor.
private static double GetDoubleValue(string input)
{
    double n = 0;
    int decimalPosition = input.Length;
    bool separatorFound = false;
    bool negative = input[0] == '-';
    for (int k = (negative ? 1 : 0); k < input.Length; k++)
    {
        char c = input[k];

        if (c == '.' || c == ',')
        {
            if (separatorFound)
                return Double.NaN;
            decimalPosition = k + 1;
            separatorFound = true;
        }
        else
        {
            if (!char.IsDigit(c))
                return Double.NaN;
            n = (n * 10) + (c - '0');
        }
    }
    return ((negative ? -1 : 1) * n) / pow(10, input.Length - decimalPosition);
}

C++
stream'den okunabilir.
std::istringstream s( "1234.123456" );
double d;
s >> d;
boost
lexical_cast kullanılabilir.
std::string     val = "2.12e-6";
double y = boost::lexical_cast<double>(val);
C
double atof (const char* str) kullanılarak yapılabilir.

atof
%lf ile double'ın okunması
printf ile double yazdırırken sadece %f kullanmak yeterliydi. Çünkü printf variadic olduğundan herşeyi double'a cast ediyordu. Ancak okurken scanf türü metodlara sadece pointer geçiyoruz. Dolayısıyla kaç byte okumak istediğimizi belirtmemiz gerekiyor. %lf ile double okumak istediğimizi belirtiyoruz.

strod
strod atof'tan daha gelişmiş. Gereksiz boşlukları atlıyor ve alabildiği kadar çok karakteri çevirmeye çalışıyor.

Hiç yorum yok:

Yorum Gönder