Здравствуйте! Только начала изучать Си, пока плохо его понимаю. Подскажите, как написать программку для написания арифметическое действия
Сообщение отредактировано: Провинциалка -
Вычисление арифметического выражения, Задачка на СИ |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
Вычисление арифметического выражения, Задачка на СИ |
Провинциалка |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Женский Реальное имя: Ольга Репутация: 2 |
Здравствуйте! Только начала изучать Си, пока плохо его понимаю. Подскажите, как написать программку для написания арифметическое действия
Сообщение отредактировано: Провинциалка - Прикрепленные файлы ___________________1_C_.rar ( 18.3 килобайт ) Кол-во скачиваний: 321 |
Провинциалка |
Сообщение
#2
|
Пионер Группа: Пользователи Сообщений: 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 |
Сообщение
#3
|
Уникум Группа: Пользователи Сообщений: 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 и т.д.). Но тут, я думаю, это сделано специально, чтоб продемонстрировать пределы точности машинных вычислений. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 11.05.2024 2:10 |