IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V  1 2 3 >  
 Ответить  Открыть новую тему 
> Вычисление арифметического выражения, Задачка на СИ
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Здравствуйте! Только начала изучать Си, пока плохо его понимаю. Подскажите, как написать программку для написания арифметическое действия

Сообщение отредактировано: Провинциалка -


Прикрепленные файлы
Прикрепленный файл  ___________________1_C_.rar ( 18.3 килобайт ) Кол-во скачиваний: 318
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






А можно присоединить в другом формате (лучше в графическом) для тех, у кого нет возможности открыть docx?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Ребята, извините. Я сегодня поздно вышла сайт, сейчас не успеваю всё объяснить, убегаю на лекции. Часа через четыре приду, и сразу за комп...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Добрый вечер,Уважаемые!
Касательно моей темы: в качестве своего вопроса, позвольте мне тогда выложить файл в котором описана вся моя лабораторная работа. В конце её, в таблице, даны варианты заданий - мой 12-й. Файл в формате doc, как просил Volvo.
Посмотрите пожалуйста, возможно ли вообще для такого примера написать программу на СИ++.
Спасибо


Прикрепленные файлы
Прикрепленный файл  _____1___.doc ( 173 килобайт ) Кол-во скачиваний: 972
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 с распространяется так быстро, что вот я тоже оказалась здесь
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
А значение выражения все-таки чему равно: 6.25e+06 или 1.00117?
Не поверишь. Ни первому, ни второму. Если раскрыть скобки, то получается b2/b2, соответственно, в результате должна получиться 1-ца. Посмотри, может, это наведет тебя на мысль о том, почему такое происходит:
http://liveworkspace.org/code/9f907855c69b...3d26dcb63fbc49b

(подсказка: посмотри, чему равно b2 при использовании типа float, и подумай, а чему это должно быть равно на самом деле? И почему печатается то, что печатается?)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


М
Оль, пожалуйста, уважай Правила..
Название темы изменено.



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> - -m-++n

А в чём смысл подобных вопросов? Научить людей делать вид, что они понимают подобную нечитаемую шнягу, не встречающуюся в реальной жизни у нормальных людей? Или чтобы сразу отпугнуть от такого стиля написания кода?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Не подскажете, почему компилятор выдаёт ошибку в строчке "float a2 = pow(a, 2);"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Не выдает компилятор ошибки. Там же приведен результат прогона программы, как он мог получиться, если программа не компилируется?

Наверное, все зависит от того компилятора, которым ты пользуешься? У меня (и на сайте, куда я давал ссылки) используется GCC. Он прекрасно компилирует приведенный код...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Здравствуйте! Не хотела бы пока закрывать эту тему, очень надо всё узнать до конца.
В процессе изучения кодов, которые вы мне предложили, мне пришла в голову мысль попробовать написать свой вариант решения задачи и получилось вот что:

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>

int main()
{

float a, b, rezult;
a = 1000;
b = 0.0001;
rezult = (pow(a + b,2) - (pow(a,2) + (2 * a * b))) / pow(b,2);
printf("%4.4f \n" ,rezult);
system("PAUSE");
}


Код полностью работоспособен, но волнует вопрос: почему в случае с float мой результат = 1, а ваш результат = 6.25e+06 ? (В случае с double решения сходятся)
И
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> pow(a + b,2)

А почему не (a+b)*(a+b)?
Я не знаю эту функцию, но мне кажется, она неявно переводит числа в более точный формат.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Цитата
Я не знаю эту функцию
- на вас не похоже что вы чего-то можете не знать, ну да ладно больше не буду задавать дурацкие вопросы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 !

Сообщение отредактировано: Провинциалка -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Провинциалка @ 11.04.2011 19:10) *
Допустим в случае с float: b^2 = 9.99999905105e-09
во случае c double: b^2 = 1.00000000000000002e-08
Вроде одинаковые значения?
Эти два заначения отличаются друг от друга в восьмом знаке (я имею в виду значащие цифры), то есть на 0.00001% (я пометил красным, где начинается различие). Это и есть приблизительно точность float, так что совпадение можно считать полным.

Цитата
А на каком основании компилятор посчитал значение (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) - выброси и сделай вид, что этого никогда не было smile.gif.

Если говорить про результирующее выражение (вар.12), то в нем должна получаться 1 при любых a и b (кроме b=0, ессно), так как в нем b2 и в числителе, и в знаменателе. Отклонение от 1 представит точность вычислений. В твоем случае входных данных происходит сложение/вычитание чисел скщественно разных порядков, при этом результирующая точность вычислений сильно падает. Таких случаев лучше стараться избегать (специальным подбором методов) либо максимально возможно увеличивать точность представления (double и т.д.). Но тут, я думаю, это сделано специально, чтоб продемонстрировать пределы точности машинных вычислений.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Женский
Реальное имя: Ольга

Репутация: -  2  +


Огромное спасибо за исчерпывающий ответ. Завтра буду защищать лабораторную. Попробую сказать тоже самое что здесь написано.
Хочу уточнить следующее: как лучше ответить преподавателю, если он спросит - почему такое сильное различие в результатах при использовании различные типов данных -
Цитата
максимально возможно увеличивать точность представления
?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Провинциалка @ 12.04.2011 15:44) *
как лучше ответить преподавателю, если он спросит - почему такое сильное различие в результатах при использовании различные типов данных - ?
Операции сложения и вычитания могут приводить к большой потере точности вычислений, если операнды имеют большую разницу по абсолютной величине. Потеря точности (в знаках) равна разности порядков чисел. Например, если ты складываешь/вычитаешь 100 и 0.01 (полученные в результате других вычислений, то есть уже определенные не совсем точно), потеря точности составит 4 знака. Точность представления типа float в стандартной архитектуре x86 составляет 7-8 знаков (точно не помню, поправьте, если что). При сложении a2 и ab (1000000 и 0.1) происходит практически полная потеря точности, и результаты вычислений на основе float в данном случае полностью теряют значимость (и представляют собой, грубо говоря, случайные числа). Точность double составляет примерно 15 знаков, поэтому результат вычислений с double сохраняет некоторую значимость (хотя точность сильно понижается тоже).

Сообщение отредактировано: Lapp -


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

3 страниц V  1 2 3 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 7:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name