Здравствуйте! Только начала изучать Си, пока плохо его понимаю. Подскажите, как написать программку для написания арифметическое действия
Сообщение отредактировано: Провинциалка -
Вычисление арифметического выражения, Задачка на СИ |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Вычисление арифметического выражения, Задачка на СИ |
Провинциалка |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Здравствуйте! Только начала изучать Си, пока плохо его понимаю. Подскажите, как написать программку для написания арифметическое действия
Сообщение отредактировано: Провинциалка - Прикрепленные файлы ___________________1_C_.rar ( 18.3 килобайт ) Кол-во скачиваний: 323 |
volvo |
Сообщение
#2
|
Гость |
А можно присоединить в другом формате (лучше в графическом) для тех, у кого нет возможности открыть docx?
|
Krjuger |
Сообщение
#3
|
Профи Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: 20 |
Если вы скопировали, и вырезали откуда то,то сделали весьма неудачно.Так как нигде не видно самого арифметического выражения.
2. Вычислить значения выражений. Объяснить полученные результаты. № 12 Задание 1 при a=1000, b=0.0001 Задание 2 1) - -m-++n 2) m*n<n++ 3) n- - > m+ + 1. Для ввода и вывода данных использовать операции >> и << и стандартные потоки cin и cout. Тоже весьма сомнительно для Си,вожможно все таки С++?Или у вас эти для языка обьединены. В общем,либо напишите суда сами,либо,как, volvo, предложил. P.S.to volvo,а почему не сохраняются пробелы,или это доступно только при использовании тегов кода? Сообщение отредактировано: Krjuger - |
Провинциалка |
Сообщение
#4
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Ребята, извините. Я сегодня поздно вышла сайт, сейчас не успеваю всё объяснить, убегаю на лекции. Часа через четыре приду, и сразу за комп...
|
Провинциалка |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Добрый вечер,Уважаемые!
Касательно моей темы: в качестве своего вопроса, позвольте мне тогда выложить файл в котором описана вся моя лабораторная работа. В конце её, в таблице, даны варианты заданий - мой 12-й. Файл в формате doc, как просил Volvo. Посмотрите пожалуйста, возможно ли вообще для такого примера написать программу на СИ++. Спасибо Прикрепленные файлы _____1___.doc ( 173 килобайт ) Кол-во скачиваний: 980 |
volvo |
Сообщение
#6
|
Гость |
Цитата возможно ли вообще для такого примера написать программу на СИ++. Можно, конечно. Вот, смотри. Если писать напрямую ("в лоб", что называется):http://liveworkspace.org/code/811f40765cf7...3891702f83505ca Если сделать чуть-чуть хитрее, и не копировать код, а написать так, чтобы изменить только типы: http://liveworkspace.org/code/f30fe60c1f0b...8771b75defe4030 (результаты, как видишь, одинаковые) А вот теперь - самое интересное: объясни полученные результаты. Почему при использовании типа float получается так, а при использовании double - эдак? Что касается второго задания - тебе надо просто подумать, при заданных значениях m, n чему будет равно каждое из заданных выражений. На самом деле - вопрос о приоритете операций, и на внимательность/знание синтаксиса выражений. Попробуй сделать сама, что не получится - говори... |
Провинциалка |
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
1) Спасибо огромное!
2) А значение выражения все-таки чему равно: 6.25e+06 или 1.00117? 3) Мои мои знания в СИ ещё сырыми-то назвать нельзя, поэтому объяснить полученные результаты пока не в состоянии. Мне бы самой хотелось задать вам несколько глупых вопросов по коду. Но как-то неудобно спрашивать.(Кстати, а ведь результаты-то и так и эдак одинаковые? 6.25e+06 (1.00117) Или я не так поняла?) 4) Ну а второе задание...Мне придется, наверное, перечитать для начала много литературы, прежде чем я пойму смысл задания. Вы уж извините, что я к вам обратилась за помощью, просто наш преподаватель во-первых, часто болеет, во-вторых, объясняет, мягко говоря недоступно, ну и в-третьих - молва о хорошем сайте forum.pascal.net.ru с распространяется так быстро, что вот я тоже оказалась здесь |
volvo |
Сообщение
#8
|
Гость |
Цитата А значение выражения все-таки чему равно: 6.25e+06 или 1.00117? Не поверишь. Ни первому, ни второму. Если раскрыть скобки, то получается b2/b2, соответственно, в результате должна получиться 1-ца. Посмотри, может, это наведет тебя на мысль о том, почему такое происходит:http://liveworkspace.org/code/9f907855c69b...3d26dcb63fbc49b (подсказка: посмотри, чему равно b2 при использовании типа float, и подумай, а чему это должно быть равно на самом деле? И почему печатается то, что печатается?) |
Lapp |
Сообщение
#9
|
|||
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
TarasBer |
Сообщение
#10
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> - -m-++n
А в чём смысл подобных вопросов? Научить людей делать вид, что они понимают подобную нечитаемую шнягу, не встречающуюся в реальной жизни у нормальных людей? Или чтобы сразу отпугнуть от такого стиля написания кода? -------------------- |
Провинциалка |
Сообщение
#11
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Не подскажете, почему компилятор выдаёт ошибку в строчке "float a2 = pow(a, 2);"
|
volvo |
Сообщение
#12
|
Гость |
Не выдает компилятор ошибки. Там же приведен результат прогона программы, как он мог получиться, если программа не компилируется?
Наверное, все зависит от того компилятора, которым ты пользуешься? У меня (и на сайте, куда я давал ссылки) используется GCC. Он прекрасно компилирует приведенный код... |
Провинциалка |
Сообщение
#13
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Здравствуйте! Не хотела бы пока закрывать эту тему, очень надо всё узнать до конца.
В процессе изучения кодов, которые вы мне предложили, мне пришла в голову мысль попробовать написать свой вариант решения задачи и получилось вот что: #include <stdio.h> Код полностью работоспособен, но волнует вопрос: почему в случае с float мой результат = 1, а ваш результат = 6.25e+06 ? (В случае с double решения сходятся) И |
TarasBer |
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> pow(a + b,2)
А почему не (a+b)*(a+b)? Я не знаю эту функцию, но мне кажется, она неявно переводит числа в более точный формат. -------------------- |
Провинциалка |
Сообщение
#15
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Цитата Я не знаю эту функцию - на вас не похоже что вы чего-то можете не знать, ну да ладно больше не буду задавать дурацкие вопросы. |
volvo |
Сообщение
#16
|
Гость |
Цитата волнует вопрос: почему в случае с float мой результат = 1, а ваш результат = 6.25e+06 ? Во-первых, не 1, а 1.0000008344650269... Если ты попросила показывать только 4 знака после запятой - это не значит, что больше цифр нет. Тебе просто их не показывают. Замени свой printf на такой:printf("%2.16f \n" ,rezult);, увидишь более точный результат. Но твое решение - это игра против правил. Во-первых, ты нарушаешь пункт 1: Цитата 1. Для ввода и вывода данных использовать операции >> и << и стандартные потоки cin и cout , и выводишь результат не через потоки вывода.Во-вторых, сам смысл задания состоит в том, что Цитата 3. При выполнении задания 1 надо использовать вспомогательные переменные для хранения промежуточных результатов , то есть, не полагаться на возможную оптимизацию, которую проведет компилятор, а вычислить именно через промежуточные выражения, чтобы показать разницу в обработке разных типов данных. То, что ты сделала - это ненужное вычисление. В принципе, и без компилятора можно мгновенно сказать, чему будет равно значение выражения при любых a, b. Задача в данном случае другая. И, до настоящего момента, ты ее не осознала. Ибо, почему вычисленные результаты настолько отличаются один от другого - ты так и не объяснила. И даже не попыталась, хотя я подсказывал тебе, куда смотреть. Ну, как знаешь... |
Провинциалка |
Сообщение
#17
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Я и вправду проделала лишнюю работу. Видимо так увлеклась, что не увидела требования в конце задания. Извиняюсь.
А почему вычисленные результаты настолько отличаются один от другого, я кажется поняла, но не настолько чтобы успокоиться. Допустим в случае с float: b^2 = 9.99999905105e-09 во случае c double: b^2 = 1.00000000000000002e-08 Вроде одинаковые значения? А на каком основании компилятор посчитал значение (a+b)^2 - (a^2 + 2*a*b) = 1.0011717677116394e-08. Пересчет на калькуляторе дает значение 0,01 ! Сообщение отредактировано: Провинциалка - |
Lapp |
Сообщение
#18
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Допустим в случае с float: b^2 = 9.99999905105e-09 Эти два заначения отличаются друг от друга в восьмом знаке (я имею в виду значащие цифры), то есть на 0.00001% (я пометил красным, где начинается различие). Это и есть приблизительно точность float, так что совпадение можно считать полным.во случае c double: b^2 = 1.00000000000000002e-08 Вроде одинаковые значения? Цитата А на каком основании компилятор посчитал значение (a+b)^2 - (a^2 + 2*a*b) = 1.0011717677116394e-08. Пересчет на калькуляторе дает значение 0,01 ! Во-первых, компилятор ничего не считает (смотри, не ляпни такое на зачете - кто-то улыбнется, а кто-то может и урыть за непонимание сути). Компилятор делает программу, и программа уже считает. Такое ошибочное мнение у тебя, возможно, оттого, что ты работаешь в программной среде, которая каждый раз компилирует прогу перед запуском, потому что в ней почти всегда есть изменения в процессе отладки. Но после отладки ты можешь запускать только саму программу (скомпилированную, то есть exe-файл) без всякого компилятора, и она будет прекрасно считать, даже если компилятор стереть с диска на фик. Это все равно, что сказать, что кастрюля питательная )). Готовишь ты на плите в кастрюле (среда с компилятором), но ешь ты то, что сама в нее положила (твой программный код). И питательность твоей стряпни зависит всецело от тебя, а не от плиты и кастрюли )).Во-вторых.. Я не знаю, зачем тут вообще применять калькулятор. volvo уже говорил об этом: тут все считается в уме за доли секунды. Первая скобка - полный квадрат, вторая - два слагаемых из формулы его раскрытия. Результатом вычитания должно явиться третье слагаемое, то есть b2. При b=10-4 значение b2 будет равно 10-8. Так что первое число (1.0011717677116394e-08) с хорошей точностью правильное, а то, что ты насчитала на калькуляторе (0.01) - выброси и сделай вид, что этого никогда не было . Если говорить про результирующее выражение (вар.12), то в нем должна получаться 1 при любых a и b (кроме b=0, ессно), так как в нем b2 и в числителе, и в знаменателе. Отклонение от 1 представит точность вычислений. В твоем случае входных данных происходит сложение/вычитание чисел скщественно разных порядков, при этом результирующая точность вычислений сильно падает. Таких случаев лучше стараться избегать (специальным подбором методов) либо максимально возможно увеличивать точность представления (double и т.д.). Но тут, я думаю, это сделано специально, чтоб продемонстрировать пределы точности машинных вычислений. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Провинциалка |
Сообщение
#19
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Огромное спасибо за исчерпывающий ответ. Завтра буду защищать лабораторную. Попробую сказать тоже самое что здесь написано.
Хочу уточнить следующее: как лучше ответить преподавателю, если он спросит - почему такое сильное различие в результатах при использовании различные типов данных - Цитата максимально возможно увеличивать точность представления ? |
Lapp |
Сообщение
#20
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
как лучше ответить преподавателю, если он спросит - почему такое сильное различие в результатах при использовании различные типов данных - ? Операции сложения и вычитания могут приводить к большой потере точности вычислений, если операнды имеют большую разницу по абсолютной величине. Потеря точности (в знаках) равна разности порядков чисел. Например, если ты складываешь/вычитаешь 100 и 0.01 (полученные в результате других вычислений, то есть уже определенные не совсем точно), потеря точности составит 4 знака. Точность представления типа float в стандартной архитектуре x86 составляет 7-8 знаков (точно не помню, поправьте, если что). При сложении a2 и ab (1000000 и 0.1) происходит практически полная потеря точности, и результаты вычислений на основе float в данном случае полностью теряют значимость (и представляют собой, грубо говоря, случайные числа). Точность double составляет примерно 15 знаков, поэтому результат вычислений с double сохраняет некоторую значимость (хотя точность сильно понижается тоже).Сообщение отредактировано: Lapp - -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 4.06.2024 3:57 |