2016-03-09 4 views
-1

У меня возникла проблема с моим strtod(), похоже, некоторые цифры. Я читаюC - strtod, кажется, добавляет цифры

2\t5241021356985.0302\t9.09\t825.45 

из файла и после пропуска число 2 я получаю следующие выходные данные

output: 5241021356985.030273 9 .090000 

Вот мой код

char *input_string = (char*) calloc(filesize, sizeof (char*)); 
char *output_string = (char*) calloc(filesize, sizeof (char*)); 
char *input_end; 
fgets(input_string, filesize, infile); 
input_end = input_string; 
int size_to_read = (int) strtof(input_string, &input_end); 
char *temp_string=(char*)calloc(70,sizeof(char*)); // max double value 
double temp = 0; 
++input_string; 
for (int i = 0; i < size_to_read; ++i) { 
    temp = strtod(input_string, &input_end); 
    sprintf(temp_string, "%lf\t", temp); 
    strcat(output_string, temp_string); 
    input_string = input_end; 
    ++input_string; 
} 
strcat(output_string, "\0"); 
printf("output: %s\n", output_string); 
+0

[Пожалуйста, см это обсуждение о том, почему бы не использовать возвращаемое значение 'malloc()' и family в 'C'.] (http://stackoverflow.com/q/605845/2173917). –

+0

Похож на [float imprecision] (http://floating-point-gui.de/) вещь. –

ответ

0

Как правило, тип double имеет около 16 -17 десятичных цифр.
Теперь это не какое-то число цифр после десятичной точки - это общее количество значащих цифр, период. (Вот почему это называется плавающей точки.)

Так что не случайно, что номер, который вы читали в, а число распечатанное обратно, отличаются примерно после 17-го разряда:

input: 5241021356985.0302 
output: 5241021356985.030273 
digits: 123456789
       1   2 
Смежные вопросы