баг в форматированном выводе double

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

баг в форматированном выводе double

Сообщение virt » 18.05.2006 23:48:32

Код: Выделить всё
program teylor_tab_1;
var a, b, h, _eps : double;
    x, sl, sc, el : double;
    i : integer;
    f1, f2, f3 : text;

begin
   a := 0;
   b := 4;
   h := 0.3;
   _eps := 1E-6;
   assign(f1, 'tt1.out');rewrite(f1);
   assign(f2, 'tt2.out');rewrite(f2);
   assign(f3, 'tt3.out');rewrite(f3);
   x := a;
   while (x <= b) do
   begin
      sl := x;
      el := x * (-1) * sqr(x) / (3 * 6);
      sc := sl + el;
      i := 1;
      while (abs(sl - sc) > _eps) do
      begin
         sl := sc;
         inc(i);
         el := el * (-1) * sqr(x) * (2 * i - 1) / ((2 * i + 1) * (2 * i + 1));
         sc := sl + el;
      end;
      writeln(f1, x:0:5,' ',sl:0:7);
      writeln(f2, x,' ',sl:0:7);
      writeln(f3, x:0:4,' ',sl);
      x := x + h;
   end;
   close(input);
end.


fpc2.0.0

первый файл создаётся нормально ,а второй и третий пишутся не полностью. если при записи третьего файла поставить
writeln(f3, x:0:3,' ',sl); пишется на 1 строку больше. Проверьте у себя пожалуйста ,и отпишите о результатах.
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение STAKANOV » 19.05.2006 07:15:12

Тут и проверять ничего не надо. Забыл в конце файлы закрыть:
Код: Выделить всё
close(f1);
close(f2);
close(f3);


а
Код: Выделить всё
close(input)

это зачем? :?

и 2.0.0 лучше сменить на 2.0.2 :wink:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение virt » 19.05.2006 08:08:35

дело в том что сначала был код с 1 файлом(input)
Код: Выделить всё
   assign(input,'tt1.out');rewrite(input);
.......................
         sc := sl + el;
      end;
      writeln(x,' ',sl:0:7);
      x := x + h;
   end;
   close(input);
end.

так вот та же ошибка ,недописывает до конца.

сменил на 2.0.2 ,жду 2.0.4:)
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение STAKANOV » 19.05.2006 09:02:21

virt писал(а):дело в том что сначала был код с 1 файлом(input)
Код: Выделить всё
   assign(input,'tt1.out');rewrite(input);
.......................
         sc := sl + el;
      end;
      writeln(x,' ',sl:0:7);
      x := x + h;
   end;
   close(input);
end.

так вот та же ошибка ,недописывает до конца.

сменил на 2.0.2 ,жду 2.0.4:)


я думаю, что использовать перемнную модуля system здесь наверно не стоит.

я не совсем понял - вариант с
Код: Выделить всё
close(f1);
close(f2);
close(f3);

сработал?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение virt » 21.05.2006 10:41:47

Я не понял что я там сдела ,но все заработало. Скорее всего какая то небольшая опечаточка была из-за которой и работало неправильно.
virt
новенький
 
Сообщения: 35
Зарегистрирован: 01.12.2005 12:31:41

Сообщение Boriss » 22.05.2006 15:57:15

Для текстовых файлов Flush(f1); - дождаться опустошения буфера
Flush empties the internal buffer of an opened file F and writes the contents to disk. The file is \textit{not} closed as a result of this call.
Boriss
незнакомец
 
Сообщения: 8
Зарегистрирован: 31.08.2005 15:17:34

Сообщение STAKANOV » 23.05.2006 08:37:30

Код: Выделить всё
program teylor_tab_1;
var a, b, h, _eps : double;
    x, sl, sc, el : double;
    i : integer;
    f1, f2, f3 : text;

begin
   a := 0;
   b := 4;
   h := 0.3;
   _eps := 1E-6;
   assign(f1, 'tt1.out');rewrite(f1);
   assign(f2, 'tt2.out');rewrite(f2);
   assign(f3, 'tt3.out');rewrite(f3);
   x := a;
   while (x <= b) do
   begin
      sl := x;
      el := x * (-1) * sqr(x) / (3 * 6);
      sc := sl + el;
      i := 1;
      while (abs(sl - sc) > _eps) do
      begin
         sl := sc;
         inc(i);
         el := el * (-1) * sqr(x) * (2 * i - 1) / ((2 * i + 1) * (2 * i + 1));
         sc := sl + el;
      end;
      writeln(f1, x:0:5,' ',sl:0:7);
      writeln(f2, x,' ',sl:0:7);
      writeln(f3, x:0:4,' ',sl);
      x := x + h;
   end;
   close(f1); {!!!!}
   close(f2); {!!!!}
   close(f3); {!!!!}
end.

Только в таком виде программа будет работать нормально. Если и так заработало, то возможно это случайность и при следующем запуске это может не повториться.

Для текстовых файлов Flush(f1); - дождаться опустошения буфера

close опустошает буфер перед закрытием
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 82

Рейтинг@Mail.ru