0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 7
|
||||||
1 | ||||||
Расчёт дисперсии25.04.2013, 08:28. Просмотров 1669. Ответов 12
Метки нет Все метки)
(
Привет!
У меня возникла странная проблема - при считывании столбца данных из текстового файла (данных около 20 000) и расчёта дисперсии - она получается равной нулю (если считываю именно из второго столбца!). Если же считываю из первого, то, вроде, все нормально. В первом столбце числа порядка 0.04, во втором - порядка 7.0. Вот код:
P.S. На лишние закомментированные выражения не обращайте внимания)))
0
|
|
25.04.2013, 08:28 | |
Вычисление дисперсии
Рассчитать дисперсию, используя функции определения среднего и дисперсии
|
|
25.04.2013, 11:43 | 2 |
Судя по выражениям вида s1 = s1 + , никакого понятия о языке С у вас нет. Константы везде, вместо double - целые. Наверняка, и тип переменной указан неверно и происходит округление до целого нуля.
0
|
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 7
|
|||||||||||
25.04.2013, 17:36 [ТС] | 3 | ||||||||||
1. Константы, как и переменные, везде объявлены как double, просто я это не стал копировать.
2. Почему, если я написал
0
|
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 7
|
|
25.04.2013, 21:32 [ТС] | 5 |
Я не думал о таких мелочах, как неверное указывание типа данных (double).
Меня до сих пор продолжает волновать вопрос неверного расчёта дисперсии.
0
|
25.04.2013, 22:25 | 6 |
Пока выбор правильного типа данных будет для вас "мелочью", верный расчет вы сможете получить, разве что, по ошибке. И 20+ строчек кода с простейшей арифметикой так и останутся неодолимым препятствием.
Исправьте ошибки, на которые вам указали, если все еще не будет работать - выложите заново полный код, так чтобы можно было проверить типы переменных и сам файл данных, на которых получаете ошибку - нет никакой гарантии, что они корректно записаны.
0
|
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 7
|
||||||
25.04.2013, 23:21 [ТС] | 7 | |||||
Какие ошибки? Говорю же, везде double. Вот полный код:
0
|
26.04.2013, 01:19 | 8 | |||||
Издеваетесь? У вас везде целочисленные литералы.
Код сейчас посмотрю и отвечу. Добавлено через 1 час 30 минут Насколько смог, попытался исправить этот кошмар. О корректности ваших формул ничего не могу сказать, но очевидно, что у вас нет представления не только о C, но и о программировании вообще. Почитайте хотя бы вводные главы (файлы, циклы) любого учебника. И еще. Я уже писал в другом топике, как точка вместо запятой стоила американцам потери Mariner-1. Пока идиомы языка, стиль форматирования кода, выбор корректного типа данных, регистра букв и имен переменных будут для вас "мелочью", вы обречены. Good Luck !
0
|
1172 / 885 / 94
Регистрация: 03.08.2011
Сообщений: 2,455
|
|
26.04.2013, 03:33 | 9 |
gazlan, При арифметических операциях типы неявно преобразуются к наибольшему. В данном случае все целочисленные константы преобразуются компилятором к типу double. Нет никакого смысла их менять в коде ТС на константы вещественного типа. Разница будет только если первыми операциями в выражении идет целочисленное деление ( что то вроде: double a = 100 / 33 * 0.1; в данном случае сначала будет произведено целочисленное деление, потом его результат будет неявно приведен к double. Здесь лучше или явно сделать одну из констант при делении вещественной, или же просто перенести умножение в начало.)
0
|
26.04.2013, 05:22 | 10 |
Формально, это преобразование находится внутри тройного вложенного цикла и должно выполняться 3 000 000 000 раз для каждого литерала.
Разумеется, оптимизирующий компилятор, такой как VC, должен вынести это преобразование за цикл, а в идеале, и вовсе выполнить во время компиляции и сразу подставить адрес внутреннего представления с двойной точностью. Тем не менее, всегда лучше обозначить свои намерения явно - так будет проще и для компилятора и для читающего код. Кроме того, это самый мелкий из промахов автора. Например, внутри двойного цикла (30 000 раз), у него вставлен вызов fopen(). Так что, исправления не сводились к расстановке точек - код переписан чуть менее, чем полностью.
0
|
0 / 0 / 0
Регистрация: 10.03.2013
Сообщений: 7
|
|
26.04.2013, 08:00 [ТС] | 11 |
Согласитесь, открывание в цикле fopen не повлечет за собой изменения результатов выводимых данных. Константы привел к double, однако все равно дисперсия считается за 0.
0
|
26.04.2013, 08:35 | 12 |
Не соглашусь.
Вы все еще напрочь не понимаете смысл того что вами сделано (или списано). Почитайте, наконец, хоть что-нибудь про операции с файлами. Кроме того, в вашем коде есть и другая грубейшая ошибка. Перечитывайте вот это вот - до просветления:
0
|
1172 / 885 / 94
Регистрация: 03.08.2011
Сообщений: 2,455
|
|
26.04.2013, 12:28 | 13 |
0
|
26.04.2013, 12:28 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Вычислить среднее и оценку дисперсии значений введенных элементов массива. Расчет сумм в формуле и расчет xi должны быть оформлены в виде отдельных функций.
Расчет дисперсии фрагмента изображения Расчёт дисперсии
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |