Имя: Пароль:
IT
 
есть кто силен в Паскале?
,
0 Визард
 
19.10.11
15:48
есть программа

program ZZZZ;
const
xn = 3.2;
xk = 7.2;
hx = 0.8;
a  = 4.1;
var
x : real;
Y : real;
begin
writeln('xn = ', xn:1:2);
writeln('xk = ', xk:1:2);
writeln('hx = ', hx:1:2);
writeln('a  = ', a:1:2);
writeln;

x := xn;
Y := 0;

while ( x <= xk ) do
 begin
  if ( x <= a ) then
   Y := Exp( 2 * x - 5)
  else
   Y := Sqr( sin( x / 5 ) / cos( x / 5 ) );
  write('x = ', x:1:2);
  writeln('      Y = ', Y:1:4);
  x := x + hx;
 end;
writeln;
writeln('Press "ENTER" to exit.');
readln;
end.

когда x становится равным 7.2 цикл не выполняется? почему? кто-нибудь может объяснить?
1 filh
 
19.10.11
15:50
while ( x <= xk ) do читай как
while ( 7.2 <= 7.2 ) do
2 Kreont
 
19.10.11
15:50
Ну так условие в цикле с передпроверкой стоит
3 Kreont
 
19.10.11
15:52
Перепиши на repeat untel
4 Kreont
 
19.10.11
15:52
*until
5 Визард
 
19.10.11
15:53
(3) напиши условие окончания цикла
6 Птица
 
19.10.11
15:54
(2) и что? условие же истинно
7 AeDen
 
19.10.11
15:54
(2) при равенстве должно выполниться
(0) хз, надо гонять в отладчике, так-то должно выполниться.
8 Kreont
 
19.10.11
15:55
repeat
begin
end
until x > xk
9 Жан Пердежон
 
19.10.11
15:55
(0) там же отладчик встроенный есть
10 Визард
 
19.10.11
15:56
(7) "при равенстве должно выполниться " а вот не хочет
(8) тоже не хочет так работать
11 Kreont
 
19.10.11
15:58
Знчит тип real плохой :)
Видно числит х=7,2000000000001
12 catena
 
19.10.11
15:58
А если х все время округлять до 1 знака после запятой?
13 filh
 
19.10.11
15:59
(10) тип real имеет "шум" на оконечных знаках. Если задается явно, тогда без шума, при выполнеиии арифметических операций появляется этот "шум".
сам посмотри
while ( x <= xk ) do
 begin
  if ( x <= a ) then
   Y := Exp( 2 * x - 5)
  else
   Y := Sqr( sin( x / 5 ) / cos( x / 5 ) );
  write('x = ', x:1:2);
  writeln('      Y = ', Y:1:4);
  x := x + hx;
  writeln('x = ', x);
 end;
writeln;
14 Godofsin
 
19.10.11
16:00
То есть в последней итерации он пишет тебе что Х = 6.6?
15 xenos
 
19.10.11
16:01
округление до 1 знака после запятой
16 Godofsin
 
19.10.11
16:01
то есть 6.4?
17 Визард
 
19.10.11
16:02
(16) да 6.4
18 filh
 
19.10.11
16:03
(17) округляй, а вообще правильней задавать полшага больше, т.е.
while ( x <= (xk + hx/2)) do
19 Godofsin
 
19.10.11
16:04
Тогда попробуй (15)
20 Kreont
 
19.10.11
16:04
(0) Сделай xk = 7.3;
21 filh
 
19.10.11
16:04
погрешность, так сказать.
22 Godofsin
 
19.10.11
16:06
(20) Обойти то можно, интересней узнать, почему условие = false ))
23 miki
 
19.10.11
16:06
(17)Выведи x без форматирования
24 filh
 
19.10.11
16:06
(23) я уже в (13) намекнул, но все пофиг...
25 filh
 
19.10.11
16:07
все=ТС
26 Kreont
 
19.10.11
16:08
2+2=4 int
или (случайно для real, зависит от скачков напряжения:)
2,0+2,0=4,000000001  
или
2,0+2,0=4.0 real
или
2,0+2,0=3,999999999999
27 Визард
 
19.10.11
16:08
(23) ниче это не дало .... нули дополнились и все. делал так
28 Godofsin
 
19.10.11
16:09
(27)Округлить, попробуй округлить уже
29 Визард
 
19.10.11
16:09
(22) абсолютно йес
30 Визард
 
19.10.11
16:10
(28) секунду щас сделаем :)
31 Жан Пердежон
 
19.10.11
16:11
(26) ты уверен, что это для real, а не для single/double?
32 filh
 
19.10.11
16:13
чтож за народ, вот смотрите:
xn =  3.20000000000000E+0000
xk =  7.20000000000000E+0000
hx =  8.00000000000000E-0001
a  =  4.10000000000000E+0000

x = 3.20      Y = 4.0552
x =  4.00000000000000E+0000 xk =  7.20000000000000E+0000
x = 4.00      Y = 20.0855
x =  4.80000000000291E+0000 xk =  7.20000000000000E+0000
x = 4.80      Y = 2.0402
x =  5.60000000000582E+0000 xk =  7.20000000000000E+0000
x = 5.60      Y = 4.2682
x =  6.40000000000873E+0000 xk =  7.20000000000000E+0000
x = 6.40      Y = 11.1646
x =  7.20000000001164E+0000 xk =  7.20000000000000E+0000

x =  7.20000000001164E+0000 - это последняя итерация. 1164 все видят? или только я?
33 Kreont
 
19.10.11
16:14
(31) для всех типов с плавающей точкой думаю такие гляки будут
Причем если через ОЛЕ читать, то еще и не такие округления бывают
34 ado
 
19.10.11
16:14
(6) Уверен? А если не 2 десятчных знака вывести, а все, и посмотреть?
35 Godofsin
 
19.10.11
16:16
гы)
36 ado
 
19.10.11
16:17
(32) Ну вот, а ТС нагло врет в (27) и честным людям голову морочит.
37 catena
 
19.10.11
16:18
(33)О, да, OLE еще та проказница :(
38 Evpatiy
 
19.10.11
16:20
(32) "Ты думаешь я тут арбузы продаю? Нет! Я с людми тут общаюсь!" (с)
39 miki
 
19.10.11
16:36
(32)чисто академический интерес:
а если сменить рил на дубль или экстендед?
40 filh
 
19.10.11
16:38
(39) доубль норм будет, экстендет проверять надо...
41 filh
 
19.10.11
16:42
это для доубля:
xn =  3.20000000000000E+0000
xk =  7.20000000000000E+0000
hx =  8.00000000000000E-0001
a  =  4.10000000000000E+0000

x = 3.20      Y = 4.0552
x =  4.00000000000000E+0000 xk =  7.20000000000000E+0000
x = 4.00      Y = 20.0855
x =  4.80000000000000E+0000 xk =  7.20000000000000E+0000
x = 4.80      Y = 2.0402
x =  5.60000000000000E+0000 xk =  7.20000000000000E+0000
x = 5.60      Y = 4.2682
x =  6.40000000000000E+0000 xk =  7.20000000000000E+0000
x = 6.40      Y = 11.1646
x =  7.20000000000000E+0000 xk =  7.20000000000000E+0000
x = 7.20      Y = 57.7878
x =  8.00000000000000E+0000 xk =  7.20000000000000E+0000

Это для экстендед:
xn =  3.20000000000000E+0000
xk =  7.20000000000000E+0000
hx =  8.00000000000000E-0001
a  =  4.10000000000000E+0000

x = 3.20      Y = 4.0552
x =  4.00000000000000E+0000 xk =  7.20000000000000E+0000
x = 4.00      Y = 20.0855
x =  4.80000000000000E+0000 xk =  7.20000000000000E+0000
x = 4.80      Y = 2.0402
x =  5.60000000000000E+0000 xk =  7.20000000000000E+0000
x = 5.60      Y = 4.2682
x =  6.40000000000000E+0000 xk =  7.20000000000000E+0000
x = 6.40      Y = 11.1646
x =  7.20000000000000E+0000 xk =  7.20000000000000E+0000
42 filh
 
19.10.11
16:44
вот еще и видно в каком знаке погрешность:
xn =  3.20000000000000E+0000
xk =  7.20000000000000E+0000
hx =  8.00000000000000E-0001
a  =  4.10000000000000E+0000

x = 3.20      Y = 4.0552
x =  4.00000000000000E+0000 xk =  7.20000000000000E+0000
x-xk = -3.20000000000000E+0000
x = 4.00      Y = 20.0855
x =  4.80000000000000E+0000 xk =  7.20000000000000E+0000
x-xk = -2.40000000000000E+0000
x = 4.80      Y = 2.0402
x =  5.60000000000000E+0000 xk =  7.20000000000000E+0000
x-xk = -1.60000000000000E+0000
x = 5.60      Y = 4.2682
x =  6.40000000000000E+0000 xk =  7.20000000000000E+0000
x-xk = -8.00000000000000E-0001
x = 6.40      Y = 11.1646
x =  7.20000000000000E+0000 xk =  7.20000000000000E+0000
x-xk =  8.67361737988404E-0019
43 Визард
 
19.10.11
16:57
йопт почему константа
xn = 3.2
после присвоения ее иксу икс равен  
x = 3.200000000000727600.
44 filh
 
19.10.11
16:59
(43) Да ладно!
45 Визард
 
19.10.11
17:01
(44)я знаю почему, а вообще спасибо тебе.