Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2009, 16:44   #1
Clericos
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 11
По умолчанию QBasic. Проблема с циклом и погрешностью

Здравствуйте.

Выполняя лабораторную (на MS-DOS QBasic v1.0) столкнулся с такой проблемой
Вот элементарный код (все лишнее специально убрал чтобы было проще понять):
Код:
FOR X = 1 TO 4 STEP .1
  N = 2 * X
  PRINT "N("; X; ")="; N
NEXT X

END
И вот что получается на выходе:
Цитата:
N( 1 )= 2
N( 1.1 )= 2.2
N( 1.2 )= 2.4
N( 1.3 )= 2.6
N( 1.4 )= 2.8
N( 1.5 )= 3
N( 1.6 )= 3.2
N( 1.7 )= 3.4
N( 1.8 )= 3.6
N( 1.9 )= 3.8
N( 2 )= 4
N( 2.1 )= 4.2
N( 2.2 )= 4.4
N( 2.3 )= 4.6
N( 2.4 )= 4.8
N( 2.5 )= 5
N( 2.6 )= 5.199999
N( 2.7 )= 5.399999
N( 2.799999 )= 5.599999
N( 2.899999 )= 5.799999
N( 2.999999 )= 5.999999
N( 3.099999 )= 6.199998
N( 3.199999 )= 6.399998
N( 3.299999 )= 6.599998
N( 3.399999 )= 6.799998
N( 3.499999 )= 6.999998
N( 3.599999 )= 7.199997
N( 3.699999 )= 7.399997
N( 3.799999 )= 7.599997
N( 3.899998 )= 7.799997
N( 3.999998 )= 7.999997
Т.е. все идет прекрасно до 2.7 а дальше набегает какая-то погрешность.
Это вообще нормально для QBasic?
Просто лабу девушка попросила сделать, теперь непонятно, толи так и должно быть (особенность платформы)? То ли надо как-то объявить переменные...

Код:
DEFDBL X
DEFDBL N
FOR X = 1 TO 4 STEP .1#
N = 2 * X
PRINT "N("; X; ")="; N
NEXT X
END
но тогда все превращается в такой бред:

Цитата:
N( 1 )= 2
N( 1.1 )= 2.2
N( 1.2 )= 2.4
N( 1.3 )= 2.600000000000001
N( 1.4 )= 2.800000000000001
N( 1.5 )= 3.000000000000001
N( 1.600000000000001 )= 3.200000000000001
N( 1.700000000000001 )= 3.400000000000001
N( 1.800000000000001 )= 3.600000000000001
N( 1.900000000000001 )= 3.800000000000002
N( 2.000000000000001 )= 4.000000000000002
N( 2.100000000000001 )= 4.200000000000002
N( 2.200000000000001 )= 4.400000000000002
N( 2.300000000000001 )= 4.600000000000002
N( 2.400000000000001 )= 4.800000000000002
N( 2.500000000000001 )= 5.000000000000003
N( 2.600000000000001 )= 5.200000000000003
N( 2.700000000000002 )= 5.400000000000003
N( 2.800000000000002 )= 5.600000000000003
N( 2.900000000000002 )= 5.800000000000003
N( 3.000000000000002 )= 6.000000000000004
N( 3.100000000000002 )= 6.200000000000004
N( 3.200000000000002 )= 6.400000000000004
N( 3.300000000000002 )= 6.600000000000004
N( 3.400000000000002 )= 6.800000000000004
N( 3.500000000000002 )= 7.000000000000004
N( 3.600000000000002 )= 7.200000000000005
N( 3.700000000000002 )= 7.400000000000005
N( 3.800000000000002 )= 7.600000000000005
N( 3.900000000000003 )= 7.800000000000005
В общем простое задание оказалось с сюрпризом.
Может надо просто на старом компьютере запускать?

Заранее спасибо.
Clericos вне форума Ответить с цитированием
Старый 27.11.2009, 16:55   #2
Clericos
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 11
По умолчанию

Если у кого есть возможность запустить этот код у себя на qbasic и выложить результат, буду очень благодарен
Цитата:
FOR X = 1 TO 4 STEP .1
N = 2 * X
PRINT "N("; X; ")="; N
NEXT X

END
Clericos вне форума Ответить с цитированием
Старый 30.11.2009, 10:23   #3
Clericos
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 11
По умолчанию

Ну раз никих предложений и мыслей нет, так и вставлю в отчет с погрешностью.

Цитата:
...
N( 2.5 )= 5
N( 2.6 )= 5.199999
N( 2.7 )= 5.399999
N( 2.799999 )= 5.599999
N( 2.899999 )= 5.799999
N( 2.999999 )= 5.999999
N( 3.099999 )= 6.199998
N( 3.199999 )= 6.399998
N( 3.299999 )= 6.599998
N( 3.399999 )= 6.799998
N( 3.499999 )= 6.999998
N( 3.599999 )= 7.199997
N( 3.699999 )= 7.399997
N( 3.799999 )= 7.599997
N( 3.899998 )= 7.799997
N( 3.999998 )= 7.999997
Clericos вне форума Ответить с цитированием
Старый 30.11.2009, 10:35   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Это вообще нормально для QBasic?
Вроде не нормально...
Последний раз пользовался qBasic-ом лет 15 назад - там всё как надо вычислялось..

Могу предложить только такой вариант:

Код:
FOR X = 10 TO 40 STEP 1
N = 2 * X/10
PRINT "N("; X/10; ")="; N
NEXT X
END
EducatedFool вне форума Ответить с цитированием
Старый 30.11.2009, 18:16   #5
Clericos
Пользователь
 
Регистрация: 12.08.2009
Сообщений: 11
По умолчанию

Ваш вариант отрабатывает корректно. Я тоже об этом думал, но это не прикладное решение, а лабораторная... и как-то это плохо смотрится, но все равно, большое спасибо

В общем, закончилось все вот так:
Добавил в начало DEFDBL <переменная>- это дало повышенную точность

а в конце дабл преобразовал в сингл при помощи CSNG(<переменная>) - это срезало погрешность

Код:
DEFDBL X
DEFDBL N
FOR X = 1 TO 4 STEP .1#
<форула>
PRINT "N("; CSNG(X); ")="; CSNG(N)
NEXT X
END
получилось красиво на выходе, но вообще странно все это как-то.
Clericos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с циклом BuT@JL Помощь студентам 3 25.03.2009 17:53
Adodb+smarty проблема с циклом while Oleg_453 PHP 2 02.12.2008 14:41
Проблема с циклом.. POPOV Помощь студентам 3 29.04.2008 18:36
Помогите с циклом Almost_Famous Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 27.03.2008 21:08
Задача с циклом POPOV Общие вопросы Delphi 13 01.02.2008 20:33