2016-01-21 62 views
2

在K & R第71頁中,atof函數使用數組索引。我試圖使用指針算法實現相同的功能(因爲它使感覺像一個壞蛋:))。K&R的這個實現有什麼問題?

double atof(char *str) 
{ 
    int sign; 
    double number = 0.0, power = 1.0; 

    while(isspace(*str)) 
    ++str; 

    sign = (*str == '-') ? -1 : 1; // Save the sign 

    if(*str == '-' || *str == '+') // Skip the sign 
    str++; 

    while(isdigit(*str)) // Digits before the decimal point 
    { 
    number = 10.0 * number + (*str - '0'); 
    str++; 
    } 

    if(*str == '.') // Skip the decimal point 
    str++; 

    while(isdigit(*str)) // Digits after the decimal point 
    { 
    number = 10.0 * number + (*str - '0'); 
    power *= 10.0; 
    str++; 
    } 


    return sign * number/power; 

}

在主

printf("%g\n", atof(" 123123.123")); // Outputs 123123 
printf("%g\n", atof(" 1234.1222")); // Outputs 1234.12 

什麼是我的錯!

回答

4

atof()執行情況良好。但是使用%g的printf刪除了部分結果。

6是默認的,如果你沒有明確指定它。由於產生的值具有更高的精度,因此會丟失。指定精度:

printf("%.12g\n", atof(" 123123.123")); 
printf("%.12g\n", atof(" 1234.1222")); 

或者,你可以使用%f(這將打印雖然尾隨零)。

+0

該死的我應該知道的:)。那麼%g的默認精度是6位數?! – MAA

+0

是(包括*小數*和小數部分的總寬度)。 6是大多數printf精度的默認值。您可以在這裏閱讀C標準中的詳細信息:http://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p8 –

+0

非常感謝你。特別是對於包括這個標準。 – MAA