|
есть кто силен в Паскале? | ☑ | ||
---|---|---|---|---|
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)я знаю почему, а вообще спасибо тебе.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |