Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 06.02.2010, 22:04   #11 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Всегда пожалуйста
MrSTEP вне форума   Ответить с цитированием

Старый 06.02.2010, 22:04
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Я думаю, что было бы очень полезно почитать аналогичные обсуждения

Надеюсь на подсказку

Старый 20.02.2010, 00:37   #12 (permalink)
Linka
Member
 
Аватар для Linka
 
Регистрация: 24.01.2010
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 26
По умолчанию

Попробовал вот тоже решить вторую задачу. Только с помощью функции. Но выдает ошибку Floating point overflow. Господа, можете ткнуть пальцем где у меня ошибка ? Уж, не могу сам дойти.

Код:
program funckcija;
         uses crt;
var x:real;

function func(xs:real):real;
begin
func:=x*sqr(x)-sqr(x)+16*x-43;
end;

begin
clrscr;
x:=-4;
repeat
x:=x+0.5*x;
writeln(func(x):8:2);
until x=4;
readln
end.
Linka вне форума   Ответить с цитированием
Старый 20.02.2010, 01:04   #13 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

У вас в функции описана переменная xs, а используется х. Попробуйте исправить
MrSTEP вне форума   Ответить с цитированием
Старый 20.02.2010, 01:48   #14 (permalink)
Linka
Member
 
Аватар для Linka
 
Регистрация: 24.01.2010
Сообщений: 43
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 26
По умолчанию

Ох, точно, не заметил. Но, к сожалению, выдает всё ту же ошибку.

Последний раз редактировалось Linka; 20.02.2010 в 01:57
Linka вне форума   Ответить с цитированием
Старый 20.02.2010, 02:15   #15 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

x:=x+0.5*x;
-зачем умножать? написано же, с шагом 0.5:
x:=x+0.5;
И да, смените Real на Double.
Long Cat вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 20.02.2010, 10:33   #16 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Long Cat Посмотреть сообщение
И да, смените Real на Double.
Это я как-то не очень понимаю - зачем бы? Вроде нигде там особо больших чисел не образуется. У меня, например, проходит без проблем так:
Код:
program funckcija;
uses crt;
var x:real;

function func(xs:real):real;
begin
 func:=xs*sqr(xs)-sqr(xs)+16*xs-43;
end;

begin
 clrscr;
 x:=-4;
 repeat
  x:=x+0.5;
  writeln(x:4:1,func(x):10:2);
 until x=4;
 readln
end.
А вообще я бы, на свой вкус, решал эту задачку так:
Код:
var
 i:integer;
begin
 For i:=-8 to 8 do
  WriteLn(0.5*i:4:1, (0.125*i*i*i-0.25*i+8*i-43):10:2);
 readln;
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 20.02.2010, 10:37   #17 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Как я понял, там требуется сосчитать 6 знаков после запятой, а у real точность 5 знаков. Запас по арифметической точности должен быть не менее 5 знаков.
Вообще, при математических расчетах, применять real нужно с осторожностью - точность низкая.

вот тут будут проблемы:
Цитата:
var
i:integer;
begin
For i:=-8 to 8 do
WriteLn(0.5*i:4:1, (0.125*i*i*i-0.25*i+8*i-43):10:2);
readln;
end.
0.5* integer или integer*integer(integer*0.125 - это что? double, extendent или real?
умножение числа с плавающей запятой на целое может создать огромные проблемы новичкам при отладке.

Последний раз редактировалось Long Cat; 20.02.2010 в 10:40
Long Cat вне форума   Ответить с цитированием
Старый 20.02.2010, 11:11   #18 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Не согласен ни с одним пунктом.
Цитата:
Сообщение от Long Cat Посмотреть сообщение
Как я понял, там требуется сосчитать 6 знаков после запятой
Где Вы это взяли? Еще раз пересмотрел всю ветку - не нашел. А у MrStep'a и Linka и вовсе поставлен формат с двумя знаками.
Цитата:
а у real точность 5 знаков. Запас по арифметической точности должен быть не менее 5 знаков.
Вообще, при математических расчетах, применять real нужно с осторожностью - точность низкая.
Ну очень странно. Формат Real имеет следующие параметры:
Диапазон: -2.9е-39..1.7е38
Количество значащих цифр: 11-12
Количество байтов: 6
И это в очень старой версии Турбо-Паскаля.
И куда тут большая точность?
Цитата:
вот тут будут проблемы:


0.5* integer или integer*integer(integer*0.125 - это что? double, extendent или real?
умножение числа с плавающей запятой на целое может создать огромные проблемы новичкам при отладке.
Да ни малейших проблем тут нет и не будет. Во-первых, я без проверки (трансляции и запуска) сюда, как правило, ничего не выкладываю. Во-вторых, проблем при умножении числа с плавающей запятой на целое не возникает в принципе. Они могут возникнуть при обратной последовательности, каковой в моей программе, как видите, нет. Я избегаю конструкций типа b=i*a, где а и b - вещественные, i - целое. В крайнем случае ставлю доп. множитель: b=1.0*i*a. А что до того, какой формат - это зависит от того, что в данной реализации принято по умолчанию. Обычно, если я не ошибаюсь, Double. Но IMHO в данном случае и Real сойдет.
Vladimir_S вне форума   Ответить с цитированием
Старый 20.02.2010, 11:34   #19 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

Сложите в два числа типа real
1000000 и 0.01;
теперь аналогично сложите два числа типа double.

Проблема в том, например, что вы знаете, что нужно избегать конструкций вида b=i*a, где а и b - вещественные, i - целое, а те, кто будет писать свой код на основе этого - не знают.
Long Cat вне форума   Ответить с цитированием
Старый 20.02.2010, 11:55   #20 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Long Cat Посмотреть сообщение
Сложите в два числа типа real
1000000 и 0.01;
теперь аналогично сложите два числа типа double.
Сложил. Как и ожидалось, никакой разницы - в обоих случаях 1000000.01. Проблемы возникают только, если применить формат Single - а вот этого, конечно, делать не следует. Вы, вероятно, держите в уме Си-шные форматы.

Цитата:
Проблема в том, например, что вы знаете, что нужно избегать конструкций вида b=i*a, где а и b - вещественные, i - целое, а те, кто будет писать свой код на основе этого - не знают.
Так еще раз повторяю - мой код такой конструкции и не содержит. Между прочим, для проверки переставил в своем коде сомножители так, что i впереди - и тоже проходит. Поэтому и говорю, что проблемы в принципе могут возникнуть. Но не обязательно возникнут.

P.S. А вообще - не IMHO не стОит особенно сокрушаться, что у новичков возникнут такого рода проблемы. Если сумеет их локализовать и преодолеть - то программист и получится!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 12:42.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.