Какво бъркам
37 отговора
1742 прегледа
Какво бъркам
Ето един прост код на С++
#include <iostream>
using namespace std;
//sredno aritmeti4no
double sa(int a, int masiv[])
{
int k=0;
double sa;
for(int i=0; i<a; i++)
{
k +=masiv;
}
sa = k/a
cout<<sa;
return sa;
}
//nai golqmo 4islo
int ng(int a, int masiv[])
{
int k=masiv[0];
for(int i=0; i<a; i++)
{if (k>masiv)
k=k;
else k=masiv;
}
return k;
}
//nai malko 4islo
int nm(int a, int masiv[])
{
int k=masiv[0];
for(int i=0; i<a; i++)
{if (k<masiv)
k=k;
else k=masiv;
}
return k;
}
//glavna funkicq
int main()
{
int a;
cout<<"kolko 4isla da ima masiva ?";
cin>>a;
int masiv[a];
for(int i=0;i<a;i++)
{
cin>>masiv;
}
cout<<"\n"<<"\n"<<"sredno aritmetu4no: "<<sa(a, masiv)<<"\n";
cout<<"Nai golqmoto ot tezi 4isla e: "<<ng(a, masiv)<<"\n";
cout<<"Nai malkoto ot tezi 4isla e: "<<nm(a, masiv)<<"\n";
return 0;
}
Като го компилирам и го пусна ако средноаритмети4ното на въведените числа е десетична дроб ми връща цяло число. Къде е грешката (това се случва доста често )
Break The UnBreakable
#include <iostream>
using namespace std;
//sredno aritmeti4no
double sa(int a, int masiv[])
{
int k=0;
double sa;
for(int i=0; i<a; i++)
{
k +=masiv;
}
sa = k/a
cout<<sa;
return sa;
}
//nai golqmo 4islo
int ng(int a, int masiv[])
{
int k=masiv[0];
for(int i=0; i<a; i++)
{if (k>masiv)
k=k;
else k=masiv;
}
return k;
}
//nai malko 4islo
int nm(int a, int masiv[])
{
int k=masiv[0];
for(int i=0; i<a; i++)
{if (k<masiv)
k=k;
else k=masiv;
}
return k;
}
//glavna funkicq
int main()
{
int a;
cout<<"kolko 4isla da ima masiva ?";
cin>>a;
int masiv[a];
for(int i=0;i<a;i++)
{
cin>>masiv;
}
cout<<"\n"<<"\n"<<"sredno aritmetu4no: "<<sa(a, masiv)<<"\n";
cout<<"Nai golqmoto ot tezi 4isla e: "<<ng(a, masiv)<<"\n";
cout<<"Nai malkoto ot tezi 4isla e: "<<nm(a, masiv)<<"\n";
return 0;
}
Като го компилирам и го пусна ако средноаритмети4ното на въведените числа е десетична дроб ми връща цяло число. Къде е грешката (това се случва доста често )
Break The UnBreakable
Редактирано от nupaT на
Re: Какво бъркам
<<Какво бъркам..>>
Бъркаш клуба.
Освен това бъркаш ако си мислиш че някой ще седне да ти търси индексите и италиците из тоя код.
Бъркаш клуба.
Освен това бъркаш ако си мислиш че някой ще седне да ти търси индексите и италиците из тоя код.
Re: Какво бъркам
Голяма грешка cin>>a;
int masiv[a];
Неможеш да задаваш размера на масива в runtime. За целта има динамична памет. На средно аритметичното си изпуснал индексa и там където пишеш k=k; можеш да оставиш само ; (празен оператор). Не съм го компилирал. Пробвай!
Оправи първо тия бъгове и...
War - Gods, Monsters and Men will die together in the end!
int masiv[a];
Неможеш да задаваш размера на масива в runtime. За целта има динамична памет. На средно аритметичното си изпуснал индексa и там където пишеш k=k; можеш да оставиш само ; (празен оператор). Не съм го компилирал. Пробвай!
Оправи първо тия бъгове и...
War - Gods, Monsters and Men will die together in the end!
Редактирано от CyberPunk на
Re: Какво бъркам
Поне има желание да научи нещо.
War - Gods, Monsters and Men will die together in the end!
War - Gods, Monsters and Men will die together in the end!
Re: Какво бъркам
Боже, Боже ...
Обяснявам: като се делят две int числа резултата е int.
Резултата от k/a e int. Това че ти го присвояваш на double изобщо не играе в случая защото първо се извършва делението после присвояването. Я пробвай така:
sa = (double)k/a;
А иначе тя цялата програма си е за конкурса "Колко най-много глупости мога да напиша на 50 реда"
Обяснявам: като се делят две int числа резултата е int.
Резултата от k/a e int. Това че ти го присвояваш на double изобщо не играе в случая защото първо се извършва делението после присвояването. Я пробвай така:
sa = (double)k/a;
А иначе тя цялата програма си е за конкурса "Колко най-много глупости мога да напиша на 50 реда"
Re: Какво бъркам
"А иначе тя цялата програма си е за конкурса "Колко най-много глупости мога да напиша на 50 реда"
True... True...
Откъде го изкопа т'ва лого с Туийг ? Дай някой линк в случай, че там се намира и някой епизод :)
True... True...
Откъде го изкопа т'ва лого с Туийг ? Дай някой линк в случай, че там се намира и някой епизод :)
Re: Какво бъркам
Поне алгоритмите за най-малко и най-голамо число са верни.
War - Gods, Monsters and Men will die together in the end!
War - Gods, Monsters and Men will die together in the end!
Елементарно, Уотсън
Грешката ти е, че индексирането по i и станало Italic. Веднага се сещам за няколко решения:
1. Обграждаш кода така:
[ pre ]код[/pre ] ( но без интервалите в таговете )
2. Ползваш произволна друга буква различна от i и b ( щот Bold ).
3. Слагаш интервал :
masiv[ i ]
Смятам, че като оправиш това ще изникнат и други неща свързани със самия код.
Редакция:
(1) не върви, карай по 2 и 3.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
1. Обграждаш кода така:
[ pre ]код[/pre ] ( но без интервалите в таговете )
2. Ползваш произволна друга буква различна от i и b ( щот Bold ).
3. Слагаш интервал :
masiv[ i ]
Смятам, че като оправиш това ще изникнат и други неща свързани със самия код.
Редакция:
(1) не върви, карай по 2 и 3.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Редактирано от Colombino на
Re: Елементарно, Уотсън
Вече му казах че е изпуснал индекса.
War - Gods, Monsters and Men will die together in the end!
War - Gods, Monsters and Men will die together in the end!
Re: Елементарно, Гибсън
Пикльо, ето ти няколко неща над които да помислиш:
1. Стига с компетентни изказвания.
2. Чети задълбочено. Ако нещо не ти е ясно има голяма вероятност проблемът да е в теб, а не в написаното (Коломбино много добре е описал какво се получава и съвсем не става дума за "изпускане" на индекса)
3. Киберпънкарията е художествена измислица и над определена възраст на всеки му става ясно, че реалната действителност е по-гадна от тази в романите на Ричард Гибсън.
Понеже много хора, ще се учудят що взимам толкова навътре тая глупост - ми щото ми е писнало от дрисльовци(16-20 годишни), на които като кажа: "Не, не съм хаквал сайта на Пентагона", "Не, не ползвам Уникс/Линукс, а работя с Виндоус" и "Еба ли му майката кое процесорно ядро е актуално тази седмица" ме гледат като изкопаемо и разправят из "мирка-та" колко съм бил назад с материала. Та въпросната Киберпънкня за мен се явява събирателен образ на всички онези недорасли кратуни. Пич, ако не беше ти - друг щеше да е, нищо лично.
Трябва да си взема отпуск
1. Стига с компетентни изказвания.
2. Чети задълбочено. Ако нещо не ти е ясно има голяма вероятност проблемът да е в теб, а не в написаното (Коломбино много добре е описал какво се получава и съвсем не става дума за "изпускане" на индекса)
3. Киберпънкарията е художествена измислица и над определена възраст на всеки му става ясно, че реалната действителност е по-гадна от тази в романите на Ричард Гибсън.
Понеже много хора, ще се учудят що взимам толкова навътре тая глупост - ми щото ми е писнало от дрисльовци(16-20 годишни), на които като кажа: "Не, не съм хаквал сайта на Пентагона", "Не, не ползвам Уникс/Линукс, а работя с Виндоус" и "Еба ли му майката кое процесорно ядро е актуално тази седмица" ме гледат като изкопаемо и разправят из "мирка-та" колко съм бил назад с материала. Та въпросната Киберпънкня за мен се явява събирателен образ на всички онези недорасли кратуни. Пич, ако не беше ти - друг щеше да е, нищо лично.
Трябва да си взема отпуск
Re: Какво бъркам
sa = double(k)/a ;
ПП: Как си го компилирал твоя код. Пълно е с грешки
ПП: Как си го компилирал твоя код. Пълно е с грешки
Re: Елементарно, Гибсън
И без това съм свикнал всички да си изкарват всичко на мен и винаги аз да обирам калая
War - Gods, Monsters and Men will die together in the end!
War - Gods, Monsters and Men will die together in the end!
Урок №2
1) Като търсиш средно аритметично на int числа сигурен ли си че сумата им, която правиш в k ще се събере в int. Примерно ако имаш 3 числа по 1 000 000 000 знаеш ли какво средно аритметично ще извадиш?
2) ако има опасност сумата да не се събере в int добре е k да я обявиш като double. В този случай сметката ще е малко по-бавна но по-сигурна. Може и int64 да ползваш.
3) double мисля че имаше точност 15 цифри, така че ако резултата, който очакваш има повече от 15 цифри трябва първо да сортираш масива в нарастваш ред и после да почнеш да събираш от най-малкото към най-голямото число. Това ти гарантира че ще запазваш що годе точност.
4) Ако числата са в определен интервал (примерно 100 +/- 10) или пък има някаква предварителна информация колко е горе долу средното аритметично може от всяко число да вадиш средата на интервала за да не работиш с големи числа и да се предпазиш от препълване. Примерно ако ще търсиш средното аритметично на 95, 98, 110 и 107 ами намери средното аритметично на -5(95-100), -2(98-100), 10(110 - 100) и 7(107 - 100) и после прибави 100 към получения резултат.
P.S. Леле, що чудо изписах за едно средно аритметично. А хората са казали Keep It Simple Stupid
2) ако има опасност сумата да не се събере в int добре е k да я обявиш като double. В този случай сметката ще е малко по-бавна но по-сигурна. Може и int64 да ползваш.
3) double мисля че имаше точност 15 цифри, така че ако резултата, който очакваш има повече от 15 цифри трябва първо да сортираш масива в нарастваш ред и после да почнеш да събираш от най-малкото към най-голямото число. Това ти гарантира че ще запазваш що годе точност.
4) Ако числата са в определен интервал (примерно 100 +/- 10) или пък има някаква предварителна информация колко е горе долу средното аритметично може от всяко число да вадиш средата на интервала за да не работиш с големи числа и да се предпазиш от препълване. Примерно ако ще търсиш средното аритметично на 95, 98, 110 и 107 ами намери средното аритметично на -5(95-100), -2(98-100), 10(110 - 100) и 7(107 - 100) и после прибави 100 към получения резултат.
P.S. Леле, що чудо изписах за едно средно аритметично. А хората са казали Keep It Simple Stupid
Re: Урок №2
Още един вариант:
1. Намираш броя на числата
2. Инициализираш СРЕДНОАРИТМЕТИЧНО (дабъл) с 0
3. ФОР цикъл по числата
4. Всяко число делиш на броя на числата (като плаващо делене)
5. Добавяш резултата към СРЕДНОАРИТМЕТИЧНО
+/-:
+ Гаранция че няма да се препълниш
- Трябва още отначало да знаеш колко са ти числата
- Много деления. Може да се оптимизира като деленията ги претаковаш към умножения, но може да вдигнеш грешката така
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
1. Намираш броя на числата
2. Инициализираш СРЕДНОАРИТМЕТИЧНО (дабъл) с 0
3. ФОР цикъл по числата
4. Всяко число делиш на броя на числата (като плаващо делене)
5. Добавяш резултата към СРЕДНОАРИТМЕТИЧНО
+/-:
+ Гаранция че няма да се препълниш
- Трябва още отначало да знаеш колко са ти числата
- Много деления. Може да се оптимизира като деленията ги претаковаш към умножения, но може да вдигнеш грешката така
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Тва сме го обсъждали
Не искам да се заяждам, не се сърди, но това което си написал е откровена глупост. Помисли малко и ще видиш че съм прав.
1. Предполага се, че знаеш колко са числата, нали функцията за средно аритметично приема масив и размера му.
2. Накратко казано има само минуси, няма нито един плюс.
Не можеш да препълниш double число с int-ове, а с деление на всяка стъпка само ще изгубиш точност. Не съществува такава редица от цели числа, която би се сметнала по-добре ( във всеки един смисъл ) с делене на вскяка стъпка, отколкото с делене на финала.
Жокер: Ако имаш N = 2^30 броя числа, то на всяка стъпка ти ще намаляваш порядъка на всяко число с 30 ( деление ), а мантисата остава непроменена. Следващото число ще дойде и то с намален порядък и като се извърши действието с мантисите порядъкът ще си остане същия. А при сума тая процедура ще се извърши накрая. Като резултат ще имаме един и същ отговор. Ако N не е степен на двойката ще се извърши приблизително същото но със загуба на тончност.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
1. Предполага се, че знаеш колко са числата, нали функцията за средно аритметично приема масив и размера му.
2. Накратко казано има само минуси, няма нито един плюс.
Не можеш да препълниш double число с int-ове, а с деление на всяка стъпка само ще изгубиш точност. Не съществува такава редица от цели числа, която би се сметнала по-добре ( във всеки един смисъл ) с делене на вскяка стъпка, отколкото с делене на финала.
Жокер: Ако имаш N = 2^30 броя числа, то на всяка стъпка ти ще намаляваш порядъка на всяко число с 30 ( деление ), а мантисата остава непроменена. Следващото число ще дойде и то с намален порядък и като се извърши действието с мантисите порядъкът ще си остане същия. А при сума тая процедура ще се извърши накрая. Като резултат ще имаме един и същ отговор. Ако N не е степен на двойката ще се извърши приблизително същото но със загуба на тончност.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: Тва сме го обсъждали
Тц тц тц. Какво ли разбирам аз? Аз съм само един прост потребител, който иска програмата която прави да му свърши работа, без да изгърмят изключенията по пътя. А тази програма разбира се, е толкова далеч от идеалите на информатичната коректност и точност, че ме е срам да си призная, че аз съм я родил.
Отговорът ми беше свързан със съвсем правилното допускане на tweeg, че няма гаранция, сумата на интовете да се побере в инт. Ако това е случая (а това е общия случай), грешката в края на мантисата далеч не е основния проблем.
Жокер: Ако имаш N = 2^30 броя числа, много е вероятно точно това да е случая.
Жокер 2: Когато търсиш средно артиметично, много често следващата операция е "закръгляване към инт", резултатът от която се използва за някаква база.
Относно предположението, че знаеш колко са числата, аз това не мога да го допусна. Това си е частен случай, и не виждам какво пречи по-общата формулировка.
На въпроса за порядъците, ти сам си казал: Като резултат ще имаме един и същ отговор. Но в интерес на истината, не виждам като как влияе върху точността това, дали броя на числата е степен на 2 или не. (Не съм математик де, така че ти се доверявам, че има значение.) Но загубата на точност която казваш, че ще има, ако N не е степен на 2, така или иначе винаги трябва да се предвиди.
В заключение - и ти не твърдиш, че ще има препълване. За мен плюсът си остава. Това, че няма друг е друга работа.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговорът ми беше свързан със съвсем правилното допускане на tweeg, че няма гаранция, сумата на интовете да се побере в инт. Ако това е случая (а това е общия случай), грешката в края на мантисата далеч не е основния проблем.
Жокер: Ако имаш N = 2^30 броя числа, много е вероятно точно това да е случая.
Жокер 2: Когато търсиш средно артиметично, много често следващата операция е "закръгляване към инт", резултатът от която се използва за някаква база.
Относно предположението, че знаеш колко са числата, аз това не мога да го допусна. Това си е частен случай, и не виждам какво пречи по-общата формулировка.
На въпроса за порядъците, ти сам си казал: Като резултат ще имаме един и същ отговор. Но в интерес на истината, не виждам като как влияе върху точността това, дали броя на числата е степен на 2 или не. (Не съм математик де, така че ти се доверявам, че има значение.) Но загубата на точност която казваш, че ще има, ако N не е степен на 2, така или иначе винаги трябва да се предвиди.
В заключение - и ти не твърдиш, че ще има препълване. За мен плюсът си остава. Това, че няма друг е друга работа.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Ще повторя
Не искам да се заяждам, просто ти казвам че грешиш. Ти си умно момче и не трябва да се обиждаш ( така разбирам това 'Тц тц тц. Какво ли разбирам аз?' )като добронамерено ти посочват заблудата ти.
Остави това дали имаш предварително N или не. Това не е важно. Аз така или иначе ти казвам че трябва първо да се сумират числата, а после да се делят.
Остави загубата на точност, тя също е незначителна - само в последния бит на мантисата в произволна послока. Т.е. чисто статистически грешката клони към нула.
за жокера: Аз именно това казвам: "Ако имаме ...". Т.е. допускам, че именно такъв е случая. Това което говоря е валидно до N=2^50.
Ще ти обясня пак, защото видимо на схващаш какво става при делението:
double числото има 12 бита характеристика ( по-популярна като порядък, макар това да не е особено прецизно казано. В случая това не е съществено. ) и 51+1 (1 от нормализацията )бита мантиса и още 1 бит специално за знак на мантисата.
Характеристиката, гледана като число може да представя числа от порядъка на плюс-минус 2000 ( грубо казано ).
Делението на N просто променя това число, което се намира в средата на диапазаона си с около Log2(N). Де е 1000, де е 50? Ако N e степен на двойката го променя точно с толкова, а ако не е с няколко единици разлика от нормализацията след делението ( пак с логаритмична зависимост - една единица на 1 шифт ).
Дали ще извършваш действията в средата, или в 'средата-50' разлика няма - и в двата случая в един и същи момент ще започнеш да губиш точност от мантисата и никога няма да можеш да обработиш числа от порядъка на N =2^1000 броя за да има значение къде се намира точно порядъка.
т.е. делейки числата на N преди сумиране не ти дава бонус в препълването. Препълването е непостижимо, защото за него са нужни над 2^1000 числа, което вярвам ще се съгласиш е число без практическа полза.
Редакция:
Загубата при числа които не са степен на двойката идва от следното:
като делиш от число А, имащо точно представяне получаваш приближение на A/N, което в случай че N е степен на двойката е точно A/N, щото дефакто мантисата не се изменя, а се бара само порядъка. Тва е аналогично ако в десетична бройна система делиш на степен на 10 - нямаш загуби, а само местиш точката. Ако делиш на шантаво число ( да речем 3 ) вече си зависи какво ще делиш и в общия случай имаш загуба.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Остави това дали имаш предварително N или не. Това не е важно. Аз така или иначе ти казвам че трябва първо да се сумират числата, а после да се делят.
Остави загубата на точност, тя също е незначителна - само в последния бит на мантисата в произволна послока. Т.е. чисто статистически грешката клони към нула.
за жокера: Аз именно това казвам: "Ако имаме ...". Т.е. допускам, че именно такъв е случая. Това което говоря е валидно до N=2^50.
Ще ти обясня пак, защото видимо на схващаш какво става при делението:
double числото има 12 бита характеристика ( по-популярна като порядък, макар това да не е особено прецизно казано. В случая това не е съществено. ) и 51+1 (1 от нормализацията )бита мантиса и още 1 бит специално за знак на мантисата.
Характеристиката, гледана като число може да представя числа от порядъка на плюс-минус 2000 ( грубо казано ).
Делението на N просто променя това число, което се намира в средата на диапазаона си с около Log2(N). Де е 1000, де е 50? Ако N e степен на двойката го променя точно с толкова, а ако не е с няколко единици разлика от нормализацията след делението ( пак с логаритмична зависимост - една единица на 1 шифт ).
Дали ще извършваш действията в средата, или в 'средата-50' разлика няма - и в двата случая в един и същи момент ще започнеш да губиш точност от мантисата и никога няма да можеш да обработиш числа от порядъка на N =2^1000 броя за да има значение къде се намира точно порядъка.
т.е. делейки числата на N преди сумиране не ти дава бонус в препълването. Препълването е непостижимо, защото за него са нужни над 2^1000 числа, което вярвам ще се съгласиш е число без практическа полза.
Редакция:
Загубата при числа които не са степен на двойката идва от следното:
като делиш от число А, имащо точно представяне получаваш приближение на A/N, което в случай че N е степен на двойката е точно A/N, щото дефакто мантисата не се изменя, а се бара само порядъка. Тва е аналогично ако в десетична бройна система делиш на степен на 10 - нямаш загуби, а само местиш точката. Ако делиш на шантаво число ( да речем 3 ) вече си зависи какво ще делиш и в общия случай имаш загуба.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Редактирано от Colombino на