проблема ANSI-C FSCANF - PullRequest
       10

проблема ANSI-C FSCANF

1 голос
/ 14 марта 2010

привет, я прочитал файл следующим образом

       fscanf(fp,"%f %f %f\n",&*(p1+i), &*(p2+i), &*(p3+i));

строки моего файла состоят из трех чисел с плавающей запятой ...

проблема в том, что в файле, скажем, у меня есть некоторые числа с плавающей запятой, скажем, максимум две цифры после точки. но когда я прошу c напечатать эти значения, используя другое форматирование, например,% lf,%. 2lf,%. 4lf ... он начинает играть с цифрами ... моя единственная проблема в том, что если у меня есть, скажем, 1343.23 в файле, то будет использовать это значение точно так же, как в вычислениях, или будет воспроизводиться с цифрами после точки. если он будет играть, то как можно сделать так, чтобы он использовал числа с плавающей запятой в точности такими, как они есть? например, в последнем случае, даже если я попрошу его напечатать это значение с использованием% .10lf, я бы ожидал, что оно напечатает только 1343.2300000000. Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 14 марта 2010

«Проблема» в том, что числа с плавающей точкой по определению являются приблизительными. Вы должны прочитать Что должен знать каждый учёный об арифметике с плавающей точкой для получения дополнительной информации.

Кроме того, вы можете упростить &*(x) до x, поэтому вы должны написать p1+i, p2+i, p3+i в своем вызове fscanf.

1 голос
/ 14 марта 2010

Когда вы читаете в строке 1343.23, считая ее десятичным числом, она преобразуется во внутреннее двоичное представление компьютера. Вывод с указателем формата преобразуется из двоичного в десятичное. На выходе, если вы попросите другое количество цифр после десятичной точки, вы можете не получить точно такое же значение. Конкретное десятичное число с плавающей запятой может не быть точно представимым в двоичном числе с конечной длиной, поэтому следует ожидать округления.

Более подробное объяснение см. В известной статье Что должен знать каждый ученый об арифметике с плавающей точкой .

0 голосов
/ 14 марта 2010

Количество цифр после точки не имеет значения для fscanf. Вы должны избавиться от вещи & * и добавить новую строку в конец строки:

fscanf(fp, "%f %f %f\n", p1 + i, p2 + i, p3 + i);
...