Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   помогите сделать блок-схему (http://forum.oszone.net/showthread.php?t=273077)

winston07 30-11-2013 02:10 2264178

помогите сделать блок-схему
 
Вложений: 3
Блок схемы

Iska 30-11-2013 02:20 2264180

winston07, и в чём проблемы? Пока видно не «помогите сделать», а только «сделайте за меня». См. Правила Форума, особливо шестой пункт.

winston07 30-11-2013 02:49 2264189

Iska, проблема в том,что не умею,поэтому и обратился

Tau_0 30-11-2013 05:02 2264203

Цитата:

Цитата Iska
и в чём проблемы? »

Проблема в том, что подобные дурацкие примеры (ни уму ни сердцу...) придумывают преподаватели, которые сами программивать не умеют...
См. второй пример на ветвление, если a = b

Он совсем не так прост..., ибо никогда в лоб на плавающей точке равенства не будет...

Iska 30-11-2013 07:33 2264212

Цитата:

Цитата winston07
Iska, проблема в том,что не умею,поэтому и обратился »

Вопрос первый — а что умеете. Вопрос второй — зачем брались делать, если не умеете?

Цитата:

Цитата Tau_0
Проблема в том, что подобные дурацкие примеры (ни уму ни сердцу...) придумывают преподаватели, которые сами программивать не умеют... »

Ну да, ну да. Tau_0, изучение языка начинают с азов, а не с написания «Войны и Мира».

Цитата:

Цитата Tau_0
ибо никогда в лоб на плавающей точке равенства не будет... »

Что за бред?!

Забудьте вынесенные Вами из реализации конкретных языков программирования и машинных команд плавающие точки. Кстати, с чего Вы взяли, что там вещественные, а не, скажем, целые? Об этом ровным счётом ничего не сказано. Да и не нужно этого совершенно в алгоритмизации. Так что не надо здесь рассуждать на тему особых случаев, как-то: переполнения порядка и исчезновения порядка. Вы его сейчас ещё озадачьте двумя представлениями нуля, чтоб он свихнулся.

Tau_0 30-11-2013 09:20 2264237

Цитата:

Цитата Iska
Что за бред?! »

В реальной задаче не только нули, но и ВСЕ остальные числа с плавающей точкой равны с точностью до Epsilon...
То, что нужна плавающая точка очевидно из остальных двух картинок...

В своё время мне пришлось рисовать кучу блок схем --- так тогда требовал нормо контроль… Более глупого занятия не придумаешь….
За свою жизнь я покодировал на многих языках программтрования от разных ассемблеров до языков высокого уровня… Какие-то картинки с четриками порою для себя рисавал, но блок схемы по ГОСТ не делал, --- пустая трата времени..

Большинство профессионало программистов придерживались аналогичного мнения.

Вот примерно как забавно на DxDy народ фрудит…

Цитата:

Боюсь эти понятия функциональные;принципиальные,соединений и др...
выходят вообще за рамки понятия "блок-схема " а относятся к более широкому классу структурных схем устройств например в электронике, САР но никак к программам и алгоритмам.
Я согласен что блок-схема как форма описания для современного взгляда на алгоритмизацию устарела. То же описание языка Дракон начинается с критики блок-схем и дифирамбами в адрес схем яз.Дракон.
Тем не менее в школах и ВУЗах алгоритмы изучаются на основе классических блок-схем, нравится это нам или нет.
И поэтому преподавание курса алгоритмизация и программирования должно учитывать все нюансы и недостатки языка блок-схем и сравнение с альтернативными формами представления алгоритмов.
2)правда есть т.н. парадигмы программирования, в частности функциональное направление (языки), Lisp, Refal
Можно ли говорить об отличии описаний моделей задач для этих языков от классических блок-схем ?Другими словами, для каждого стиля программирования (функционального, компонентного,cобытийного) использовать свою форму представления алгоритмов. При этом конечно терминологически отличая эти формы представления от классических блок схем.
Блок-схемы алгоритма

Iska 30-11-2013 10:25 2264263

Tau_0, Вы понимаете разницу между алгоритмом и программой?

Цитата:

Цитата Tau_0
В реальной задаче не только нули, но и ВСЕ остальные числа с плавающей точкой равны с точностью до Epsilon... »

Коллега, выражайтесь логично. «ВСЕ» — это из какой-то другой оперы. В данном случае — не «все», а вычисленные значения, чей порядок и мантисса при укладывании в используемый машиной формат представления числа одинаков, и при этом мантисса не вмещает всей значимой части. Я об этом уже писал выше:
Цитата:

Цитата Iska
…на тему особых случаев, как-то: переполнения порядка и исчезновения порядка. »

К чему повторять, да ещё и некорректно формулировать?!

Цитата:

Цитата Tau_0
За свою жизнь я покодировал на многих языках программтрования от разных ассемблеров до языков высокого уровня… »

«Имейте совесть, Штирлиц: не Вы один по Родине тоскуете».


Цитата:

Цитата Tau_0
Большинство профессионало программистов придерживались аналогичного мнения.
Вот примерно как забавно на DxDy народ фрудит… »

Пусть их… Для процедурных языков никто не отменял простого:
Структурное программирование — Википедия
Теорема Бёма — Якопини — Википедия

pva 30-11-2013 11:37 2264298

winston07, Для прогулявших лекции: http://inf1.info/book/export/html/23
Для тренировки: сделай блок-схему поиска максимума двух чисел: m=max(a,b)

Tau_0 30-11-2013 12:03 2264311

Цитата:

Цитата Iska
Пусть их… Для процедурных языков никто не отменял простого: »

Ну, если только на этале обучения...???..

Я лет 5 программировал на Modula-2, так только картинки для себя изредка рисовал – кроме меня их бы никто не разобрал. Но если Вам так нравится --- рисуйте на каждый оператор блок схему или рельсовую диаграмму. По мне так это пустое и ненужное… Хотя если заставят, то даже под нормоконтроль нарисую…
Возьмитите классику Н. Вита
Программирование на языке Модула-2
И найдите там хоть одну блок сжему. Там только редьсовые диаграммы есть. Хотя в более раньних книгах у Вирта блок схемы есть…

И на разных Fortran’ах лет 20 структурно проекционно сеточные методы долбал со слабо обусловленными матрицами. Там точное решение получалось совсем неточным и надо было далее для уточнения применять итерацинные методы. --- Понятно, что на равенство никогда не проверялось, а только на больше или меньше. По большому счёту равенство только на целых числах имеет смысл.

mrcnn 30-11-2013 13:58 2264348

Цитата:

Цитата Iska
Вопрос первый — а что умеете. Вопрос второй — зачем брались делать, если не умеете? »

Он студент.

Цитата:

Цитата Iska
Цитата:

Цитата Tau_0
на плавающей точке равенства не будет »

Что за бред?! »

Это не бред, т.к действительно так.
Цитата:

Цитата Iska
Кстати, с чего Вы взяли, что там вещественные, а не, скажем, целые? »

Если не уточнено, то значит И целые И вещественные.

Цитата:

Цитата Tau_0
блок схемы по ГОСТ не делал, --- пустая трата времени.. »

Построение блок-схем хорошо прочищает мозг. Те, кто делал по ГОСТу запустили управляемый полностью в автоматическом режиме Буран. Такая вот электроника и программирование в конце 1980х, запуск был в 1988. А что запускают те, кто обсуждают в интернете, неизвестно.

Tau_0 30-11-2013 17:01 2264420

Цитата:

Цитата mrcnn
А что запускают те, кто обсуждают в интернете, неизвестно. »

Это мне неведомо, но ДРАКОН создан для Бурана и Космоса…
Я вот на ДРАКОНЕ не писал, но с когнитивным подходом согласен --- близок он моему нутрю...:)

Tau_0 30-11-2013 17:54 2264442

Цитата:

Цитата AMDBulldozer
Тем более, когда критика основана на заведомо ошибочных положениях. »

Хм...
Я не знаю для какого языка необходимо нарисовать-блок схему...
Но вот Вам очень старая книга Д. Мак-Кракен, У. Дорн, Численные методы и программирование. Она для фортрана. Лучщего введения в численные методы я не видел. Сразу начинается с блок-схем... Очень доходчиво там это дело расписано.
Цитата:

Цитата AMDBulldozer
как всем хорошо известно, математические системы производят вычисления с бесконечной точностью. »

А вот это слишком занятно --- бесконечной точности на финитном предсталении вещественного числа в принципе быть не может...

Tau_0 30-11-2013 22:58 2264595

Цитата:

Цитата AMDBulldozer
Начать с того, что ни из чего не следует, что "a" и "b" вообще числа. »

Конечно условие задачи сформулировано никак.. --- из рук вон плохо...
Если надо нарисовать блок схему, то я бы поступил просто и незамысловато --- просто нарисовал бы укрупнённый прямоугольник типа "вычислить процедуру/функцию F". И ВСЁ --- больше ничего не надо. Мне неважно сколько в ней утверждений/операторов --- может пять, а может и тысяча. Это проектирование сверху вниз...

Но может там нужно нарисовать граф типа того, что на картинке. Тогда начинается самое интересное --- численные методы и ошибки округления...???... Но это слишком серьёзно и надолго... Тут не важен язык --- хоть на арифмометре "Феликс" считайте...

Бесполезно здесь фантазировать. Моё мнение --- здесь блок-схема никак не нужна и ничего не проясняет.

winston07 01-12-2013 03:01 2264699

нужно,вот по такому примеру

winston07 01-12-2013 03:33 2264708

посмотрите вот 2-ой правильно ли?


а вот первый и второй не знаю как бы правильно оформить(

Iska 01-12-2013 05:54 2264718

Цитата:

Цитата Tau_0
Ну, если только на этале обучения...???.. »

Естественно. Начинать надо с простого.

Цитата:

Цитата Tau_0
Возьмитите классику Н. Вита »

Очевидно, Вирта.

Цитата:

Цитата Tau_0
Программирование на языке Модула-2
И найдите там хоть одну блок сжему. Там только редьсовые диаграммы есть. Хотя в более раньних книгах у Вирта блок схемы есть… »

Ну и что? Теория относительности не отменила закон Ньютона. Вы всё время пытаетесь свести разговор к тому или иному конкретному ЯВУ. Не в этом дело.

Цитата:

Цитата mrcnn
Цитата:

Цитата Iska
Цитата:

Цитата Tau_0
ибо никогда в лоб на плавающей точке равенства не будет... »

Что за бред?! »

Это не бред, т.к действительно так. »

С коллегой Tau_0 разобрались. Он банально не сумел (причём дважды) корректно сформулировать понятие переполнения и исчезновения порядка (о котором я написал после его сообщения под номером #4). А что у Вас?

Вот Вам два числа с плавающей запятой: «?» ? «?» — между ними, говорите, равенства не будет?! Ну-ну.

mrcnn 01-12-2013 06:05 2264719

Вложений: 1
  • bs.jpg (46.10 KB, скачиваний: 20)
Как-то так.

mrcnn 01-12-2013 06:08 2264720

Цитата:

Цитата mrcnn
Вот Вам два числа с плавающей запятой: «?» ? «?» — между ними, говорите, равенства не будет?! Ну-ну. »

Зачем тогда по вашему мнению нужно разделение на типы с одинарной точностью и с двойной точностью? В частности, на языке C числа с одинарной точностью обозначаются как float, а с двойной точностью как double. Любой учебник мат анализа начинается с изложения базовой теории чисел, в том числе вещественных и натуральных. Давно открывали учебник Фихтенгольца или Зорича или Ильина, Позняка ? Откройте - узнаете массу нового и интересного практически как в первом классе.

Для сравнения вещественных чисел в профессиональных программах пишется отдельная функция, а не используется стандартные условные операторы языка ( > , < , >=, <=, ==, != )

И на сравнении вещественных чисел могут возникнуть проблемы, если подобная отдельная функция не будет реализована. Сравнение на 0 в случае с вещественными числами может не сработать, т.е 0 может не быть равным 0 . Вот например один из примеров проблемы: http://www.rsdn.ru/forum/cpp.applied/1187492.flat (Сравнение вещественных чисел)
http://www.rsdn.ru/forum/delphi/1917455.flat (Неверное сравнение чисел типа Double в Delphi)

Iska 01-12-2013 06:47 2264725

Цитата:

Цитата mrcnn
Зачем тогда по вашему мнению нужно разделение на типы с одинарной точностью и с двойной точностью? »

Для охвата большего объёма представления чисел, и, следовательно, для повышения точности вычислений. И каким боком это подтверждает не Ваше утверждение?

Цитата:

Цитата mrcnn
В частности, на языке C числа с одинарной точностью обозначаются как float, а с двойной точностью как double. »

mrcnn, берите одинарную, двойную:
Код:

#include <stdio.h>

main() {
  float a, b;
  double c, d;

  a = 1 / 3;
  b = 1 / 3;

  if(a == b) {
  printf("%s", "a equal b\r\n");
  } else {
  printf("%s", "a not equal b\r\n");
  }

  c = 1 / 3;
  d = 1 / 3;

  if(c == d) {
  printf("%s", "c equal d\r\n");
  } else {
  printf("%s", "c not equal d\r\n");
  }

}

берите любую точность (хоть на Fortran'е) — результат будет один и тот же — числа будут равны:
Цитата:

Код:

a equal b
c equal d


Цитата:

Цитата mrcnn
Любой учебник мат анализа начинается с изложения базовой теории чисел, в том числе вещественных и натуральных. »

И что?

Цитата:

Цитата mrcnn
Давно открывали учебник Фихтенгольца или Зорича или Ильина, Позняка ? »

Ни разу. Полагаете, изложенное там как-то поможет Вам доказать, что машинное представление дроби 1/3 в одной ячейке памяти не будет равно машинному представлению дроби 1/3 в другой ячейке памяти? Можете приступать. Я с удовольствием прочитаю Ваше доказательство.

Цитата:

Цитата mrcnn
Откройте - узнаете массу нового и интересного практически как в первом классе. »

Сомневаюсь, что найду там что-то новое для себя.

mrcnn, не надо мериться со мной пиписьками. Хотите обосновать своё утверждение — обосновывайте. Доказательно.

mrcnn 01-12-2013 07:05 2264729

]Это в этой программе может сравнение и работать. Но можно нарваться на ситуацию, когда она не сработает. А если оно не сработает, но на вид все будет правильно (и компилятор все съест, и программа будет работать), то в какой-то момент подобная ошибка сравнения может появиться. Ваше рассуждение индуктивное. Вы пытаетесь ОДНИМ примером доказать правильность перевода вывода на весь класс предметов, и в данном случае это ошибочно. Проблему неполной индукции еще никто не отменял. Это у вас сейчас работает, но в целом оно неправильно даже несмотря на то, что временно работает или работает в каких отдельных ситуациях. Ваш пример работает, потому что это временное исключение. Я сталкивался с ситуациями, когда 0 не был равен 0 в простых программах из-за того, что нет бесконечности. Компьютер всегда работает с приближением, поэтому разрабатываются численные методы дифференцирования, интегрирования, решения уравнений и т.д. То есть с непрерывного класса функций, в компьютере все переводится в дискретный класс функции. На теории вероятностей и мат статистике рассматривается и случай непрерывных функций, и случай дискретных функций. Компьютеры являются дискретными устройствами, поэтому вам даже в информации о процессоре Intel i7 пишут, что видеокадаптер встроенный в процессор является дискретным. В комьютере реализуются дискретные функции, потому что нельзя реализовать непрерывные. Нельзя реальный физический мир повторить в комьютере. Есть специальный курс дискретной математики в профессиональных ВУЗах для программистов и инженеров. Реализуя компьютерный алгоритм в программе, вы всегда переводите с непрерывного класса функций на дискретный.
Бесконечности вещественных чисел в компьютере нет. Поэтому на плавающей точке в лоб равенства может не быть. В электронике на физическом уровне инженерами реализована ТОЧНОСТЬ ДО определенного ЭПСИЛОН, а не бесконечность. Я имею в виду инженеров компаний типа Intel, AMD и т.д., которые занимаются созданием чипов.
1/3 переводится к конечному представлению в компьютерах.

mrcnn 01-12-2013 07:24 2264731



А ведь предупреждали: не сравнивайте вещественные числа между собой. Нет же, пока САМ не обожжется - должен попробовать. // http://forum.pascalnet.ru/lofiversio...hp/t24610.html

ВОТ ПРИМЕР КАК ОБЖИГАЮТСЯ

select * from table_name where val=1.7
Значение 1.5 остается как было, значение 1.7 меняется на 1.70000004768372.
// http://www.sql.ru/forum/958491/strannyy-kosyak-s-float

ГДЕ ТА БЕСКОНЕЧНОСТЬ, КОТОРУЮ ВЫ ТУТ МНЕ ПЫТАЕТЕСЬ ДОКАЗАТЬ?

А число 1.7 в двоичной системе имеет бесконечный хвост, который сохранить полностью не представляется возможным. // http://www.sql.ru/forum/958491/strannyy-kosyak-s-float

Это, кстати, касается и случая, когда Вы сравниваете вещественные числа, не учитывая точность представления чисел. Посмотрев в отладчике, что числа, вроде как одинаковые, но сравнение срабатывает так, как будто они разные, Вы не задумались бы, что именно в сравнении содержится ошибка. // http://popoff.donetsk.ua/text/work/prg/debug.html

У вещественных чисел есть погрешность. Сравнивайте не "равно", а больше/меньше, с учетом этой погрешности. // http://linuxforum.ru/viewtopic.php?id=4076

Не сравнивайте на равенство вещественные числа. // http://www.intuit.ru/studies/courses...?page=2?

Уж сколько раз твердили миру: не сравнивайте вещественные числа на равентство. // www.forum.mista.ru/topic.php?id=620586

Не сравнивайте вещественные числа оператором = (равно). Это не проблема Delphi, а свойство их представления. // http://rfpro.ru/?step=search&mode=an...=5&from=110280


Iska 01-12-2013 08:25 2264739

Цитата:

Цитата mrcnn
Это в этой программе может сравнение и работать. Но можно нарваться на ситуацию, когда она не сработает. »

Ага. Есть сдвиги. Уже «работает, но можно нарваться», вместо «никогда». Тогда приведите пример про «нарваться», когда «1/3» не будет равна «1/3».

Цитата:

Цитата mrcnn
Ваше рассуждение индуктивное. Вы пытаетесь ОДНИМ примером доказать правильность перевода вывода на весь класс предметов, и в данном случае это ошибочно. »

Это утверждение коллеги Tau_0:
Цитата:

ибо никогда в лоб на плавающей точке равенства не будет...
ошибочно, а вслед за ним и Ваше. Я его опровергаю «ОДНИМ» простым незатейливым примером.

Цитата:

Цитата mrcnn
Проблему неполной индукции еще никто не отменял. Это у вас сейчас работает, но в целом оно неправильно даже несмотря на то, что временно работает или работает в каких отдельных ситуациях. Ваш пример работает, потому что это временное исключение.»

Ну, ну. Повторяю уже в третьем сообщении: приведите исключение, когда «1/3» не будет равна «1/3».

Цитата:

Цитата mrcnn
Я сталкивался с ситуациями, когда 0 не был равен 0 в простых программах из-за того, что нет бесконечности. »

Эко Вас понесло. Оставим пока в покое два представления машинного нуля и т.п.

Цитата:

Цитата mrcnn
Компьютер всегда работает с приближением, поэтому разрабатываются численные методы дифференцирования, интегрирования, решения уравнений и т.д. »

Напротив.
читать дальше »
Компьютер всегда работает точно. И потому может терять представление порядка в ту или иную сторону вследствие ограниченности его (порядка) представления. И вот потому-то, что он работает точно, и разрабатываются различные методы округления для компенсации ошибок вычислений при (повторяю в третий раз) переполнении и исчезновении порядка. Но это не имеет ни малейшего отношения к тому, что два числа будут равны или не равны между собой, независимо от того, был ли потерян порядок их представления или нет, ибо порядок будет потерян равнозначно у обоих сравниваемых чисел.


читать дальше »
Цитата:

Цитата mrcnn
Компьютеры являются дискретными устройствами, поэтому вам даже в информации о процессоре Intel i7 пишут, что видеокадаптер встроенный в процессор является дискретным. В комьютере реализуются дискретные функции, потому что нельзя реализовать непрерывные. Нельзя реальный физический мир повторить в комьютере. Есть специальный курс дискретной математики в профессиональных ВУЗах для программистов и инженеров. Реализуя компьютерный алгоритм в программе, вы всегда переводите с непрерывного класса функций на дискретный.
Бесконечности вещественных чисел в компьютере нет. Поэтому на плавающей точке в лоб равенства может не быть. В электронике на физическом уровне инженерами реализована ТОЧНОСТЬ ДО определенного ЭПСИЛОН, а не бесконечность. Я имею в виду инженеров компаний типа Intel, AMD и т.д., которые занимаются созданием чипов.
1/3 переводится к конечному представлению в компьютерах. »

Цитата:

Цитата mrcnn
А ведь предупреждали: не сравнивайте вещественные числа между собой. Нет же, пока САМ не обожжется - должен попробовать. // http://forum.pascalnet.ru/lofiversio...hp/t24610.html
ВОТ ПРИМЕР КАК ОБЖИГАЮТСЯ
select * from table_name where val=1.7
Значение 1.5 остается как было, значение 1.7 меняется на 1.70000004768372. // http://www.sql.ru/forum/958491/strannyy-kosyak-s-float
ГДЕ ТА БЕСКОНЕЧНОСТЬ, КОТОРУЮ ВЫ ТУТ МНЕ ПЫТАЕТЕСЬ ДОКАЗАТЬ?
А число 1.7 в двоичной системе имеет бесконечный хвост, который сохранить полностью не представляется возможным. // http://www.sql.ru/forum/958491/strannyy-kosyak-s-float
Это, кстати, касается и случая, когда Вы сравниваете вещественные числа, не учитывая точность представления чисел. Посмотрев в отладчике, что числа, вроде как одинаковые, но сравнение срабатывает так, как будто они разные, Вы не задумались бы, что именно в сравнении содержится ошибка. // http://popoff.donetsk.ua/text/work/prg/debug.html
У вещественных чисел есть погрешность. Сравнивайте не "равно", а больше/меньше, с учетом этой погрешности. // http://linuxforum.ru/viewtopic.php?id=4076
Не сравнивайте на равенство вещественные числа. // http://www.intuit.ru/studies/courses...?page=2?
Уж сколько раз твердили миру: не сравнивайте вещественные числа на равентство. // www.forum.mista.ru/topic.php?id=620586
Не сравнивайте вещественные числа оператором = (равно). Это не проблема Delphi, а свойство их представления. // http://rfpro.ru/?step=search&mode=an...=5&from=110280 »


Зачем Вы мне это доказываете? Я об этом давно уже написал в этой теме, поднимите глаза долу на пост #5. Но всё это никак не отменяет того факта, что утверждение
Цитата:

ибо никогда в лоб на плавающей точке равенства не будет...
ложно. Можно утверждать лишь о том, что «В результате потери или исчезновения порядка при вычислениях результаты сравнения а) могут б) в некоторых случаях оказаться некорректными», а вовсе не тот тезис, из-за которого разгорелся весь сыр-бор. И плавающая точка тут совершенно не при чём. Ровно та же логика будет, к примеру, на целых числах и целочисленных вычислениях.

mrcnn 01-12-2013 09:27 2264748

ЭВМ оперирует структурами конечного типа. 1/3 не является в компьютере бесконечным. Выше приведен пример с числом 1.7, которое было преобразовано в 1.70000004768372 В 1/3 тоже добавляется в конец "мусор".. Вы проверяете на платформе i386 а на других платформах, например встроенных систем, мобильных устройств и т.п. ваш пример может не сработать. ВАША ПРОГРАММА БЫЛА ПРОВЕРЕНА ЛИШЬ НА ВАШЕМ КОМПЬЮТЕРЕ, но не проверялась на других платформах. Докажите сперва, что ваша программа работает вообще ? Если она на вашем компьютере работает, это не значит, что она правильная. С чего вы решили, что у вас правильный код? Может быть, его и не всякий компилятор скомпилирует? 1/3 вообще в языке C нет, и об этом написано у K&R, что нельзя в программе на языке С писать 1/3, это ошибка. Вы впариваете тут бред и чушь, и еще и спорите, понимая, что не правы.. Ваша программа на языке С ошибочная вообще. Помимо i386 есть еще и платформы ARM, Itanium, а помимо процессоров Intel и AMD есть еще много разных процессоров. Докажите сперва, что ваша программа, которая является как пример, является верной. где ваша выборка и результаты тестирования программы на парке, скажем из тысячи машине? и вообще вы кто такой по жизни, если спорите о простых вещах? Вы не программист вообще, а хз кто.

страница 184 Математический энциклопедический словарь
ДИСКРЕТНАЯ МАТЕМАТИКА - область математики, занимающаяся изучением свойств дискретных структур, к-рые возникают как внутри математики, так и в ее приложениях. К числу таких структур могут быть отнесены, напр. конечные группы, конечные графы, а также не-рые математич. модели преобразователей информации, конечные автоматы, машины Тьюринга и т.п. Это примеры структур финитного (конечного) характера.

страница 281 Математический энциклопедический словарь
КОНЕЧНЫЙ АВТОМАТ - матемтическая модель устройства с конечной памятью, преобразующего дискретную информацию.

страница 360
МАШИНА - абстрактное устройство, осуществляющее переработку информации. <...> Возникновение их связано с анализом понятия алгоритма, начавшегося в сер. 30-ч гг. 20 в., с развитием ЭВМ <...> Наибольшее распространение получили М., перерабатывающие дискретную информацию, типичными представителями к-рых являются конечный автомат и Тьюринга машина.

страница 597
ТЬЮРИНГА МАШИНА - название, закрепившееся за абстрактными вычислительными машинами некоторого точно охарактеризованного типа.

AMDBulldozer 01-12-2013 10:47 2264775

mrcnn, обсуждали уже. Я привел шесть разных примеров, где равенство возможно и даже необходимо. Но потом удалил сообщения, чтобы не разводить флейм. Повторю еще раз: полностью согласен с уважаемым Iska. Перестаньте мыслить категориями 20-тилетнй давности. Воспринимайте "a" и "b" из задачи не как числа, а как объекты, между которыми определено отношение эквивалентности.
А уж что именно это за объекты - неважно. Я приводил пример и с вещественными числами для которых оператор == был переопределен и с матрицами и с вещественными для которых требовалось именно побитовое совпадение и даже с виртуальными машиными в которых такие числа как 1/3 или корень из двух представлены без какой-либо потери точности...
Сущность этих объектов не имеет никакого значения для контекста задачи.
Конечно, если Вы хотите сказать, что никакие объекты не могут быть эквивалентными.... Тогда Вам на философский форум.

Я предлагаю оставить вопрос о, якобы, неправильных условиях задачи, поскольку обсуждение его автору не только не поможет, но, напротив, может создать у него ложное впечатление о том, что команды сравнения вещественных чисел на равенство были включены в архитектуру процессоров идиотами.

pva 01-12-2013 11:51 2264792

winston07,
В примере №2 у тебя из условия идут 3 стрелочки. Должно быть 2 ("да" и "нет").
Не все пути программы приводят к концу (на выводе заканчиваются стрелки).

В принципе примеры №1 и №3 могут пройти по прямой, без ветвлений (т..е. рисовать одним блоком). Но можно предусмотреть деление на ноль. Тогда появятся варианты.

Код:

                      (Начало)
                          |
                    / Дано:x,a,b /
                          |
          нет----------< x!=0? >----да
          |                          |
          |                  [ Часть1=a+(b/x) ]
          |                          |
/ Часть1 нельзя вычислить /          |
          |                          |
          |              нет-----< 0<=x? >---------да
          |              |                          |
          |  / Часть2 нельзя вычислить /    [ Часть2=sqrt(a+sqrt(x)) ]
          |              |                          |
          |              |              [ y=(a+lg|b-x|)^2/(Часть1*Часть2) ]
          |              |                          |
          |              |                  / Результат: y /
          |              |                          |
          -----------------------------------------
                          |
                      (Конец)

Забыл проверить в схеме (Часть1*Часть2)!=0. Обратите внимание, что есть 2 условия, разделённые блоком прямого прохода, причём результат вычисления в блоке может не использоваться (когда второй раз пойдём по ветке "нет". Можно оптимизировать условие в < 0<x? >


Добавлю к общему флуду:
Блок-схема предназначения для того, чтобы объяснить ход/особенности алгоритма (не вдаваясь в подробности реализации). Например, я лично рисовал блок-схемы узлов, которые программировал, чтобы объяснить их работу заказчику (при этом обучать его программированию не входило в планы). Блок-схемы надо уметь читать и писать. Для этого нужно решать "тупые" задачки в большом количестве. Ровно как обучение письму начинается с рисований "никому не нужных" закорючек.

Кстати, я заметил что компиляторы используют представление кода (3-adress-code) очень похожее на блок-схемы.

mrcnn 01-12-2013 13:44 2264841


Цитата:

Машинный нуль (англ. Machine epsilon) — числовое значение, меньше которого невозможно задавать точность для любого алгоритма, возвращающего вещественные числа. Абсолютное значение "машинного нуля" зависит от разрядности сетки применяемой ЭВМ, от принятой в конкретном трансляторе точности представления вещественных чисел и от значений, используемых для оценки точности. [1]

В языке Си существуют предельные константы FLT_EPSILON и DBL_EPSILON называемые "машинными нулями" относительно вещественного значения 1.0. FLT_EPSILON - максимальное значение типа float и имеет значение 1E-5, DBL_EPSILON - максимальное значение типа double и имеет значение 1E-16. Сумма каждого из этих значений со значением 1.0 не отличается от -1.0.

Проблема машинного нуля в том, что два числа считаются одинаковыми, если они отличаются на величину, меньшую по модулю, чем машинный ноль.[источник не указан 1101 день]

При представлении чисел со знаком в обратных двоичных кодах существуют проблема[уточнить] наличия двух обратных кодов числа 0: «положительный нуль» и «отрицательный нуль».

http://ru.wikipedia.org/wiki/%D0%9C%...BE%D0%BB%D1%8C
Константы определены в заголовочном файле float.h
Код:

#define FLT_EPSILON    1.192092896e-07F        /* smallest such that наименьшее, такое что 1.0+FLT_EPSILON != 1.0 */
#define DBL_EPSILON    2.2204460492503131e-016 /* smallest such that наименьшее, такое что 1.0+DBL_EPSILON != 1.0 */


Iska 01-12-2013 13:58 2264847

Цитата:

Цитата mrcnn
ЭВМ оперирует структурами конечного типа. »

Подтверждаю.

Цитата:

Цитата mrcnn
1/3 не является в компьютере бесконечным. »

Согласен.

Цитата:

Цитата mrcnn
Выше приведен пример с числом 1.7, которое было преобразовано в 1.70000004768372 В 1/3 тоже добавляется в конец "мусор".. »

Не добавляется. Говоря Вашими словами, происходит отсечение «невмещающихся» цифр мантиссы.

Цитата:

Цитата mrcnn
Вы проверяете на платформе i386 а на других платформах, например встроенных систем, мобильных устройств и т.п. ваш пример может не сработать. ВАША ПРОГРАММА БЫЛА ПРОВЕРЕНА ЛИШЬ НА ВАШЕМ КОМПЬЮТЕРЕ, но не проверялась на других платформах. Докажите сперва, что ваша программа работает вообще ? Если она на вашем компьютере работает, это не значит, что она правильная. С чего вы решили, что у вас правильный код? Может быть, его и не всякий компилятор скомпилирует? »

1. Видите ли, язык C, коль уж о нём заговорили, создавался именно как переносимый язык, зависящий от платформы только библиотеками (другое дело, что на практике предпочли принести переносимость в жертву производительности).
2. «Докажите сперва, что ваша программа работает вообще ?» — если Вам недостаточно исходного кода, могу выложить бинарный файл, но, боюсь, Вас и это не убедит, что «программа работает».
3. Поищите у «не всякого компилятора» параметр, включающий поддержку стандарта ANSI.

Цитата:

Цитата mrcnn
Ваша программа на языке С ошибочная вообще. »

Чем именно «ошибочная вообще»?

Цитата:

Цитата mrcnn
1/3 вообще в языке C нет, и об этом написано у K&R, что нельзя в программе на языке С писать 1/3, это ошибка. »

На какой странице [Iska задумчиво мусолит второе издание K&R]?

Цитата:

Цитата mrcnn
Помимо i386 есть еще и платформы ARM, Itanium, а помимо процессоров Intel и AMD есть еще много разных процессоров. Докажите сперва, что ваша программа, которая является как пример, является верной. где ваша выборка и результаты тестирования программы на парке, скажем из тысячи машине? »

У Вас хромает логика: не требуется доказывать корректность работы приведённого приложения для всех мыслимых платформ. Для подтверждения факта ложности категоричного императива:
Цитата:

ибо никогда в лоб на плавающей точке равенства не будет...
достаточно найти одно опровержение. Я этот факт продемонстрировал.

Цитата:

Цитата mrcnn
Вы впариваете тут бред и чушь, и еще и спорите, понимая, что не правы.. »

Я знаю, что я прав. А Вам не хватает корректных аргументов, посему Вы судорожно хватаетесь то за одно, то за другое, то вовсе:
читать дальше »
Цитата:

Цитата mrcnn
и вообще вы кто такой по жизни, если спорите о простых вещах?»

Зовут меня У, сам я вроде как отшельник… Человек я. Обычный человек.

Цитата:

Цитата mrcnn
Вы не программист вообще, а хз кто. »

Я и не утверждал нигде здесь, что я программист. Я уже лет двадцать как не программист.


Цитата:

Цитата mrcnn
Машинный нуль …

Константы определены в заголовочном файле float.h »

Говорю Вам в четвёртый раз: не надо убеждать меня в том, что я и сам хорошо знаю. Вы пытаетесь притянуть за уши определение, которое никак ни подтверждает, ни опровергает утверждения:
Цитата:

ибо никогда в лоб на плавающей точке равенства не будет...

mrcnn 01-12-2013 14:29 2264862


Цитата:

У Вас хромает логика: не требуется доказывать корректность работы приведённого приложения для всех мыслимых платформ.
Хромает логика у вас, так как при полной индукции доказывается корректность для любого возможного случая. Но так как это является невозможным (нельзя физически проверить), для упрощения считают верным, если оно является корректным до некоторого заданного n. Но на самом деле оно является неверным. Нельзя считать что-то верным пока не произведена полная индукция.
В итоге пользователи начинают обращаться в тех поддержку из-за того, что у них программа не работает. Потому что программист не предусмотрел некоторые ситуации. Поэтому, для ПО постоянно выпускают обновления, заделывающие ошибки программистов.

Цитата:

Не добавляется. Говоря Вашими словами, происходит отсечение «невмещающихся» цифр мантиссы.
Иногда на калькуляторе (Citizen) при вычислениях 1.0 превращается в 0.99999(9), что является ошибочным, так как равенство на 1.0 точное, а не приближенное. У компьютера та же самая проблема. При точном равенстве компьютер оперирует приближенным представлениям в рамках эпсилон. В той теме на которую была дана ссылка задано точное равенство, а компьютер потерял точность, в итоге возникла ошибка, так как потерялся результат выборки из базы данных. Запрос на языке SQL был задан в следующем виде select * from table_name where val=1.7 а компьютер к точном 1.7. добавил "мусор" и начал оперировать не точным 1.7 а 1.70000004768372. Никакой мантиссы не было. Причем это все эмпирически, а не на словах. Возникла ошибка.

Цитата:

Цитата Iska
достаточно найти одно опровержение. Я этот факт продемонстрировал. »

Ваша программа, которую вы привели в качестве опровержения, является неправильной, ошибочной. Сомнительно, что она будет скомпилирована gcc компилятором.
В лоб числа с плавающей точкой не сравнивают из-за погрешности. И в архитектуре процессоров заложена определенная погрешность и точность. И инженеры, проектирующие процессоры, могут ошибаться.

mrcnn 01-12-2013 15:08 2264881

Iska
В начале речь шла не о равенстве 1/3 и 1/3 а о сравнении a и b, а вы начали исходить из сравнения a и b при их равенстве сведя в итоге и a и b к 1/3. Конкретно, смотрите изображение IMG_20131130_121057.jpg топик стартера о блок схеме. Вы перевели рассуждение к ситуации, когда a и b аксиоматически являются одинаковы (и равными 1/3), что является неверным для IMG_20131130_121057.jpg Таким образом, вы подменили начальный тезис, сузив его. Причем Tau_0 прокомментировал изображение IMG_20131130_121057.jpg , а не вашу программу.

Последовательность событий:
1. 02:10, Вчера IMG_20131130_121057.jpg топик стартера о блок схеме к программе.
X = {
a / b + 1, если a > b,
a + 25, если a = b,
(a*b - 2) / a, если a < b;
}
2. 05:02, Вчера Tau_0 написал в "См. второй пример на ветвление, если a = b Он совсем не так прост..., ибо никогда в лоб на плавающей точке равенства не будет..."

Это замечание является корректным, так как сравнение вещественных чисел будет отличаться от сравнения целочисленных. В лоб сравнивать нельзя, так как в машинном представлении чисел с плавающей точкой есть погрешность.

В этой теме: http://www.rsdn.ru/forum/cpp.applied/1187492.flat в сообщении от 24.05.05 14:53 написано, что сравнивать вещественные числа нужно в некой окрестности и приведен код
Код:

bool isEq(double a, double b)
{
  return abs(a-b)<epsilon.
}


Iska 01-12-2013 15:33 2264895

Цитата:

Цитата mrcnn
Хромает логика у вас, так как при полной индукции доказывается корректность для любого возможного случая. »

Я опроверг конкретное утверждение. И попытки приплести сюда индуктивный вывод для его подтверждения уже ни к чему. Вы придумали себе нечто, и теперь с этим, Вами же придуманным, спорите.

Было сказано: «Для любых X верно Y». Я привёл опровержение, что Y верно отнюдь не для любых X. Но Вы с какого-то перепугу придумали себе и упорно требуете от меня доказательства «Для каждого X не верно Y».

Цитата:

Цитата mrcnn
Иногда на калькуляторе (Citizen) при вычислениях 1.0 превращается в 0.99999(9), что является ошибочным, »

читать дальше »
О! Давайте ещё на счётах проверим, там уж точно приложение на C откажется работать. Вот будет доказательство так доказательство!

Первое ключевое слово — «при вычислениях». Второе — «при различных». Но, повторяю вновь: это никак не подтверждает, либо опровергает сделанного утверждения:
Цитата:

ибо никогда в лоб на плавающей точке равенства не будет...
Цитата:

Цитата mrcnn
Ваша программа, которую вы привели в качестве опровержения, является неправильной, ошибочной. Сомнительно, что она будет скомпилирована gcc компилятором. »

Вы опять забыли сказать чем именно она «является неправильной, ошибочной».


Цитата:

Цитата mrcnn
В лоб числа с плавающей точкой не сравнивают из-за погрешности. И в архитектуре процессоров заложена определенная погрешность и точность. И инженеры, проектирующие процессоры, могут ошибаться. »

Вы мне выше рекомендовали кое-что почитать. Я Вам тоже порекомендую.
читать дальше »
Есть такая книга: Программирование арифметических операций в микропроцессорах. Злобин В.К., Григорьев В.Л. Ещё советского издания. И вот там на трёхстах страницах подробным образом изложены теория и, главное, практика программирования арифметических операций в двух наиболее известных микропроцессорах. С картинками, с блок-схемами. И рабочими листингами на ассемблере.

Сколько раз мне Вам повторять две вещи:
1. Я это знаю.
2. Это никак не доказывает истинности или ложности утверждения.

AMDBulldozer 01-12-2013 15:35 2264896

Понятно, что человек хочет спорить просто ради самого факта спора. Безграмотные статьи из Вики и столь же безграмотные примеры какого-то Васи Пупкина для него пример абсолютной истины. На этом заканчиваю, не буду кормить тролля.

Iska: он просто хотел, чтобы Вы поставили точку после единицы (или после тройки). Иначе производится целочисленное деление и уже его результат преобразуется в вещественное число. При этом сам он опубликовал какой-то глупый код с непонятной функцией "abs", которая при наличии #include <stdlib.h> и отсутствии #include <cmath> будет целочисленной и стало быть все числа различающиеся не более, чем на 1 окажутся равны. А при наличии <cmath> код просто не скомпиллируется, поскольку не указана область видимости. Должно быть либо std::abs, либо явная отсылка к пространству имен в "using std::abs". Но такие "мелочи" его явно не волнуют.

Можете задать ему простой вопрос: написать программу вычисяющую машинный эпсилон (котогрый он вслед за Вики безграмотно называет "машинным нулем"). Интересно, как он это сделает без операции сравнения...

Iska 01-12-2013 15:37 2264899

Цитата:

Цитата mrcnn
Iska
В начале речь шла не о равенстве 1/3 и 1/3 а о сравнении a и b, а вы начали исходить из сравнения a и b при их равенстве сведя в итоге и a и b к 1/3. Конкретно, смотрите изображение IMG_20131130_121057.jpg топик стартера о блок схеме. Вы перевели рассуждение к ситуации, когда a и b аксиоматически являются одинаковы (и равными 1/3), что является неверным для IMG_20131130_121057.jpg Таким образом, вы подменили начальный тезис, сузив его. Причем Tau_0 прокомментировал изображение IMG_20131130_121057.jpg , а не вашу программу. »

Я ничего не «подменял» и не «сужал». Коллега Tau_0 высказал утверждение. Вы этот категоричный императив поддержали. Я его опроверг.

Цитата:

Цитата AMDBulldozer
Понятно, что человек хочет спорить просто ради самого факта спора. Безграмотные статьи из Вики и столь же безграмотные примеры какого-то Васи Пупкина для него пример абсолютной истины. На этом заканчиваю, не буду кормить тролля. »

Да, Вы правы. Поступлю так же.

Tau_0 01-12-2013 16:42 2264942

Цитата:

Цитата Iska
Я его опроверг. »

Прежде,чем опровергать малость прочитайте... --- На эти грабли обычно студенты наступают или специалисты по логическому программированию, но не вычислители...

На уровне ликбеза и для уточнения посмотрите, что я имел в виду… Просто навскидку нашёл. Более каверзные случаи мне пока придумывать лениво, да и не по теме оно будет…

сравнение на равенство вещественных чисел, в последний раз, надеюсь
О сравнении действительных чисел.
Цитата:

Ситуация, описанная в начале вполне нормальна. Т.е. при преобразовании десятичного целого в двоичное вещественное все равно добавится "белый шум". И неизвестно в каком из чисел он будет больше. Ну не бывает одинаковых вещественных чисел, и сравнивать е важно на равенство или на "больше-меньше" можно только с какой-то точностью. Поэтому условие должно выглядеть примерно так
Неправильнгое сравнение двух чисел типа double

Iska 01-12-2013 17:05 2264949

Tau_0, Вас тоже «кормить» не буду. Я полагал, мы с Вами разобрались. Оказывается нет. Повторять в пятый раз одно и то же я не стану. Всё, что изложено коллеге mrcnn, считайте теперь адресованным и Вам. На сим закончим.

AMDBulldozer 01-12-2013 17:16 2264954

Цитата:

Цитата Tau_0
Ну не бывает одинаковых вещественных чисел »

Код:

#include <stdio.h>
main()
{
  float x=1.,e=1.;
  while( !( x+e == x ) ) e /= 2;
  printf("%g\n",e);
}

Конструкция !( a == b ) использована вместо a != b исключительно с целью подчеркнуть равенство чисел как условие выхода из цикла. :wink:

Drongo 01-12-2013 17:26 2264958

To All:

1. Помогите автору темы решить его вопросы и спорьте до посинения.
2. Если будет замечен переход на личности или троллинг опонента, такой пост будет выпиливаться.

mrcnn 01-12-2013 17:40 2264966

Цитата:

Цитата Iska
Вы опять забыли сказать чем именно она «является неправильной, ошибочной». »

Она является ошибочной, так как в языке С нет дробей вида p/q. Не производит оперирование конструкциями вида 1/3. В K&R есть пример насчет перевода градусов по Фаренгейту в градусы по Цельсию, и там объясняется насчет деления чисел.
Помимо этого она является ошибочной, так как вы сравниваете вещественные числа в машинном представлении напрямую. Нельзя сравнивать вещественные a и b оператором ==.

winston07 01-12-2013 18:16 2264977

вот как получилось


Tau_0 01-12-2013 18:29 2264987

Цитата:

Цитата AMDBulldozer
с целью подчеркнуть равенство чисел как условие выхода из цикла. »

Вот вы какие настырные…:) --- а читать и думать ленитесь…:(
Вот мой последний аргумент в виде цитаты…

Цитата:

Побереги печень Не все так смертельно...
temp и sum - задаются ручками (типа sum=20.0 и temp=20.0), или это результат вычисления чего-либо? Судя по названию переменной temp - видимо результат вычисления...
Классика - с переменными действительного типа надо крайне осторожно проводить такие сравнения при вычислениях. Результат 1/3 и 3/9 может быть разным где-нибудь "в последнем знаке" и его не увидеть никогда...
Может привести к определенной точности (ну например до 6 знака) а потом уж и сравнивать...
Тема: Неправильнгое сравнение двух чисел типа double (Прочитано 12390 раз)

Это я о том, что результат IF может быть как false, так и true --- сиё зависит от реализации… Только и всего.

Маленький вопрс на подумать --- чему равно с точностью до восьми знаков
1.0/3.0 + 1.0/3.0 + 1.0/3.0 =…???...
Пусть для простоты арифметика десятичная (на самом деле в машине она двоичная и от этого дополнительные фокусы,…)

PS Видимо оставанемся при своих и не будем напрягать недотыкомки…

AMDBulldozer 01-12-2013 18:41 2264995

winston07, как-то не совсем понятно. По первой Вашей блок-схеме:
Какой смысл производить проверку значения X дважды? В первый раз Вы прерываете выполнение по равенству нулю, во -второй - по меньше или равно.
Очевидно, что если второе сравнение ложно, то и первое тоже ложно. Тем более, что второе сравнение Вы производите для определения существования вещественного корня, а в таких целях оно должно быть не "меньше или рано нулю", а просто "меньше".
С другой стороны, Вы не проверяете X на равенство B. Но если они равны, то разность |B-X| (у Вас ошибочно написано |B+X|) станет равна 0, а логарифм нуля это минус бесконечность.
На Вашем месте я сначала бы произвел обе эти проверки, а потом вычислил бы Y одной формулой. В противном случае, у Вас Y оказывается равен не всей дроби, а только её числителю.

Tau_0, если бы я был преподавателем и ко мне пришел бы студент с такими соображениями как у Вас. я сразу отправил бы его на пересдачу.
Это лет 30 назад можно было рассуждать об ошибках округления. Во времена парадигмы процедурного программирования. Тогда человеку даже поаплодировали бы. Но то время безвозвратно ушло и сегодня человек рассуждающий таким образом сильно напоминает питекантропа пытающегося рассказть об особенностях охоты на мамонтов при помощи камней и дубины.
Если человек начинает рассказ с того, что вещественные числа якобы не могут быть равны, ему возвращают зачетку и отправляют переучиваться. Поскольку таким высказыванием он, как минимум, демонстрирует полное непонимание разницы между алгоритмом и его программной реализацией.

Я могу пояснить, почему в Ваших рассуждениях имеется дефект. Только что автор темы опубликовал блок-схему, в которой не проверил X на равенство B перед вычислением выражения lg|b-x|. По Вашей логике, он поступил правильно - если считать, что обе величины являются действительными числами, как Вы предположили, то они, по Вашему утверждению, не могут быть равны (Вы это не смогли доказать, но упорно этой точки зрения ипридерживаетесь) и стало быть логарифм будет существовать в области действительных чисел. То есть и проверять незачем. Точка.
Послушавшийся Вас человек напишет заведомо неверную блок-схему. Во-первых, потому, что числа могут быть равны и это было наглядно продемонстрировано в программе вычисления "машиннного эпсилон". А во-вторых, если они даже окажутся НЕ равны, они могут быть настолько близки, что логарифм выйдет за пределы представления числа. Тогда надо проверять не только равенство чисел, но еще и переполнение/потерю значимости в процессе вычисления. И не только логарифма, но после любого действия. И т.д. и т.п.
В результате получается, что сделав акцент на одном аспекте, Вы полностью упускаете из вида сопутствующие. Вы скажете, что добавите все необходимые проверки в момент написания программы и что это не имеет отношения к собственно алгоритму? И будете правы. Именно об этом и речь - человек долже сначала сформулировать для себя основную идею, а детали реализации, к которым относятся и ошибки округления, оставить на потом.
Поймите, что говоря об ошибках округления Вы ни для кого Америку не открыли. Может быть это мы откроем её для Вас, когда расскажем, что с этими ошибками научились бороться несколько десятилетий назад.

winston07 01-12-2013 19:59 2265044

ещё вот вопрос как бы к этому примеру подойти?

AMDBulldozer 01-12-2013 20:13 2265053

Цитата:

Цитата winston07
как бы к этому примеру подойти? »

Нарисуйте блок-схему для такого псевдокода:
Код:

int i, n, k=-1;
  float Y, X0, deltaX[n];
  Y=X0;
  for (i=0;i<n;i++) {
    Y += k * deltaX[i];
    k *= -1;
  }

Это при условии, что индекс начинается с 1. Если с нуля, то k=1;

Tau_0 01-12-2013 20:46 2265071

Цитата:

Цитата AMDBulldozer
Это лет 30 назад можно было рассуждать об ошибках округления. »

Ух ты какие мы грамотные…:) А вот “невежды” по вашему на DxDy по сию пору рассуждают --- лезут в дебри относительно теории погрешностей и машинно-зависимые константы упоминают...
Упрекните и их в невежестве, только учтите что там далеко не студенты…

Цитата:

Всё работало отлично, пока не пришлось работать с физическими величинами в мелком масштабе (порядок величины в единицах СИ — ). Такие переменные пришлось сравнивать с нулём по-другому
сравнение double в c++

PS Я такой Ваш ответ примерно и предполагал... Хотя в принципе мы говорим примерно об одном и том же, но на разных языках. Вот только контекст не наработан. А блок-схемы я не признаю (уже писал об этом...). --- Уж если припрёт, то буду рисовать графы с вершинами и рёбрами и для себя чёртиков на полях и в скобках рисовать…

PPS Надеюсь, что с моим основным тезисом, что "тут очень не просто..." Вы согласитеь...

winston07 01-12-2013 20:57 2265075

вот,что-то такое вышло

AMDBulldozer 01-12-2013 21:13 2265085

winston07, неверно.
Переменная i инициализируется один раз. А не каждый раз в цикле. Иначе у Вас вообще никогда цикл не завершится. В цикле Y суммируется с самим Y и элементом массива дельта х. Печать Y производится после выхода из цикла, а не каждый раз в его теле.
Примерно так:
Код:

                                      i=0; k=-1;
                                            |
                                        Y=X0;
                                            |            да
                                            |<---------------------
                                          Y=Y+k*DeltaX[i];  |
                                          k~=1;                      |
                                          i=i+1;                      |
                                            |                            |
                                            i<n?------------------
                                            | нет
                                        печать Y
                                            |
                                        конец

Проверку i<n можно поставить в начале. В конец я её перенес, чтобы проще было рисовать.

winston07 01-12-2013 21:26 2265087

AMDBulldozer,

AMDBulldozer 01-12-2013 21:39 2265094

Вложений: 1
winston07, нет, простите. Это не имеет ничего общего с тем, что я нарисовал. Попробуйте просто нарисовать схему из моего предыдущего сообщения.

winston07 01-12-2013 21:50 2265102

AMDBulldozer,

AMDBulldozer 01-12-2013 22:04 2265117

Вложений: 1
winston07, да, переменную k можно вообще убрать. Я её по привычке запихнул.
Но! Что у вас неправильно:
1. Печать Y производится единственный раз после перехода по ветке "нет". У Вас она стоит в ветке "да".
2. k можете вообще убрать - у Вас там возведение в степень, поэтому промежуточная переменная не нужна
3. У Вас написано "Y=X+(-1)^i+DeltaX". Тут сразу две ошибки:
3.1 Y надо суммировать не с X, а с самим собой - значение этой переменной накапливается в цикле. А у Вас она каждый раз инициализируется заново. То есть "Y=Y+...", а не "Y=X+..."
3.2 Я так понял, что DeltaX - это массив. В Вашей задаче у него есть индекс "i". В то время как у переменной "y" его нет. То есть надо просуммировать дельта x при всех заданных i. Тогда на схеме должно быть тоже "дельта x" с индексом i. А у Вас этого индекса нет.
Итого получается: "Y=Y+(-1)^i+DeltaX[i]".

Эта схема соответствует такой формуле:

winston07 01-12-2013 22:15 2265122

AMDBulldozer, вот так должно быть?

AMDBulldozer 01-12-2013 22:17 2265123

winston07, да, только в самом начале рядом с Y=X0 поставьте еще I=0, а то у Вас эта переменная не инициализирована.

Ай, нет!!! Не обратил внимания - от прямоугольника "I=I+1" срелка должна идти не вниз на выход, а опять вверх, перед сравнением.

winston07 01-12-2013 22:29 2265131

AMDBulldozer, вот так

AMDBulldozer 01-12-2013 22:36 2265140

winston07, ну вот уже ПОЧТИ правильно!!! Только I=0 должно быть не в сравнении, а перед ним. Там, где Y=X0. И на всякий случай советую сохранить прикрепленный файл с формулой http://forum.oszone.net/attachment.p...6&d=1385923271
В матанализе в таком контексте использование индекса "i" означает суммирование по всем его значениям. Если имеется в виду какое-то конкретое значение индекса, он указывается и в левой части равенста тоже: "y i-тое". Но поскольку я не телепат и не могу думать за автора задания, надо на всякий случай иметь с собой формулу по которой Вы составили блок-схему.
Если выяснится, что автор имел в виду более простой вариант - не суммирование, а значение при конкретном i, Вы всё равно будете в выигрыше, поскольку получится, что решили более сложную задачу.

winston07 01-12-2013 22:39 2265142

все всем спасибо большое! :)

winston07 01-12-2013 22:49 2265152


winston07 01-12-2013 22:54 2265157

а все понял,спасибо большое :)

AMDBulldozer 02-12-2013 05:35 2265311

Блин. Что-то сейчас мне начало казаться, что я всё-таки неправильно понял задачу и что надо было не вычислять Y в цикле, а выполнить самое простое и тупое вычисление y по предложенной формуле. А подвох был в том, что по условиям задачи i должно быть целым числом и именно на это его и надо было проверять: "(int)i == i".
Это подсказали даже два раза: когда в формуле i использовался в качестве показателя степени (если i действительное число, то (-1)^i комплексное) и когда i выступал в виде индекса (индекс должен быть целым).
Но эти два флудера в ветке уже успели настолько достать своими повторениями о "невозможножности равенства двух действительных чисел", что у меня совсем вылетело из головы, что числа в условии задачи типа, в общем случае, не имеют и что могут быть специально сформулированы условия при которых надо проверять наличие исключений из этого общего правила.
Черт, они даже меня сумели в результате запутать. Я расстроен.

pva 02-12-2013 09:41 2265350

winston07, Нарисуй, что получилось. У меня есть подозрение, что ты не просёк фишку с блок-схемами и у тебя есть ошибки в схемах.

winston07 02-12-2013 16:22 2265492

pva, вот, если есть возможность пожалуйста исправте если есть ошибки на самой картинке и скиньте




Tau_0 02-12-2013 16:58 2265512

winston07, Скидывать мне пока некогда...
Но вот смотрите --- мы здесь с коллегами много нафлудили про ошибки и в часности про абсолютные/относительные ошибки вычилений. Но какой либо .оценки их я не вижу...

Второе, что бросается в глаза --- алгоритм ветвится и просто идёт на выход... Это как в песок --- ни сообщений ни кодов возврата нет... Такого точно быть не должно...

pva 02-12-2013 17:59 2265540

winston07,
Картинка №1:
1. согласен с комментарием Tau_0 про выход молчком. Надо как-то пометить (хотя бы подписать ветку), что ошибочная ситуация
2. Y в формуле не равен тому, что написано в схеме. Куда делась дробь?
3. Почему не стал давать имена подвыражениям (я их называл часть1 и часть2)
4. Добавь проверку к логарифму (логарифм от 0 бесконечен), не забудь про деление на ноль, когда добавишь дробь
В остальном нормально

Картинка №2:
1. почему ТРИ стрелки при сравнении? "да", "нет", "может быть" что ли :-)
2. не понятно что это именно X=A/B+1
3. почему после вывода X нет стрелки в конец? после вывода надо идти на конец. Поводи пальцем по стрелкам. Твой палец в любом случае должен суметь добраться от начала до конца.

Картинка №3:
1. откуда взялся X?

Картинка №4:
1. откуда взялась картинка №4?

winston07 02-12-2013 19:02 2265586

pva,
Это 4-ое
3. А что нужно взять вместо Х?

Tau_0 03-12-2013 00:19 2265811

Цитата:

Цитата winston07
3. А что нужно взять вместо Х? »

А это вообще дурацкая дормула, --- она вырвана из контекста. Скорее всего i либо натуральное число {1, 2, 3, ... л} , либо неотрицательное целое число {0, 1, 2, 3, ... к-1}.
Но придать формуле какой-либо геометрический/математический смысл сложно.
О сумме тоже говорить нехорошо --- оператор сигма не написан и пределы изменения i тоже не видны.

Такое ощущение, что вы вырезали обломок целого и только его показали… Это мизер. Покажите целый лист, а ненужное я сам отброшу…
ЗЫ Какой язык программирования Вам читали...???...

pva 03-12-2013 10:29 2265982

winston07,
№3: а подумать?...
№4: формула действительно выглядит как вырванная из контекста. На соглашение о суммировании Эйнштейна не похожа. Думаю i - это обычная переменная. Формулу можно сделать одним блоком.


Время: 20:22.

Время: 20:22.
© OSzone.net 2001-