Короче, тут дохуя погромистов и вкатывальщиков. У меня для вас задача. Как посчитать сумму массива вещественных чисел? Что надо учесть в самом общем случае?
>>236438938 (OP) Какой точности будешь хранить числа, какую точность суммы хочешь получить. Чтобы хватило под все это памяти и при сложении не перекосоёбило из-за переполненения.
Создаешь цикл со счестчиком, который будет перебирать каждый елемент массива по индексу. Создаешь переменную с ответом. Суммируешь в переменную-ответ каждое следующее число, которое приходит с цикла. Когда цикл завершается выводишь на экран переменную ответ.
>>236438938 (OP) Заводишь переменную сумматор = 0 Обходишь массив в цикле При каждой итерации цикла прибавляешь к сумматору i элемент массива. По завершению цикла получаешь сумму. Изи.
>>236438938 (OP) Это один из тех тредов, где ОП задает плохо сформулированный, с кучей недосказанностей вопрос, ожидая услышать очень конкретный ответ, а в процессе хуесосит окружающих?
>>236439830 Потому что ты не понимаешь алгоритма решения задачи. Ты используешь готовый метод 'sum()', а нужно все прописать руками. Плохо знаю питон, но попробую: def summa(x): for i in x: otvet += x(i) i += 1 return otvet
>>236440787 Потому что процессор блять не может выдавать РОВНЫЕ числа. Надо округлять в любом случае до десятых / сотых / тысячных или хоть как то, как тебе надо. Вряд ли тебе 17 знаков после запятой нужны
>>236438938 (OP) Высчитываешь группы точности. То есть, группы чисел, при сложении которых, потеря точности в группе минимальна. Например, десять раз сложить 0.001 и только потом прибавить 100. Это будет точнее, чем к 100 прибавить 0.001 десять раз подряд. НАПРИМЕР Проверяешь входящие числа на принадлежность к группе. Количество переменных зависит от количества групп, которое зависит от минимального и максимального числа. Складываешь внутри группы, перекидывая в следующую по мере увеличения числа. Потом складываешь сумму каждой группы, начиная с малого.
>>236441190 >Например, десять раз сложить 0.001 и только потом прибавить 100. О, типа перед суммированием отсортить массив, чтобы проебов по точности было меньше из-за разного машинного эпсилона в разных рейнджах чисел. Да, это хорошо, спасибо.
>>236441299 Там просто челик написал, что надо в лоб считать, а не через готовую функцию. Ну я и написал в лоб, чтобы показать, что проблема не исчезает.
>>236441396 У меня типа более общий вопрос. Ну окей, я там могу посчитать и буду знать, что результат на самом деле лежит в неком интервале, типа +- машинный эпсилон. Но как это в реальност решают? Вот если я ракету разрабатываю, и там пиздец как важно, чтобы было 0.3, а не 0.2999999999999 с хуем?
>>236441733 Так это не транзистор, додик. А математика. У тебя при разложении конечной десятичной дроби в двочиное представление получается бесконечная двоичная дробь. В рельности ты не реализуешь устройство, способное представлять бесконечные числа. Долбоеб, блядь, съеби с треда, плиз. Транзисторы, блядь, у него не те. Ну надо было так обосраться.
>>236441779 Используйте нормальные языки, и будете получать нормальные ответы. И не придется с пеной у рта доказывать, что есть пикрелейтед оливье - это нормально.
>>236441690 В реальном мире работают с допустимой точностью. Ракеты падают потому что людям не хватает системного мышления. Как и тебе кстати, решаешь надуманую проблему
>>236442083 >В реальном мире работают с допустимой точностью Ага, особенно в банках. Ну потерялась пара тысяч долларов при переводе миллиарда, ну ничего, никто не заметит.
>>236438938 (OP) >Как посчитать сумму массива вещественных чисел? В нормальных языках типа так: var result = array.Sum(); Скорее всего тебе надо объявить переменную-аккумулятор float result = 0; А потом пройтись циклом по массиву и прибавлять на каждом шаге значение к аккумулятору. for (int i = 0; i < N; ++i) result += array;
>>236442372 > >Я не троллю, я спрашиваю, как софт для ракеты написать, чтобы все максимально точно было? Так и пиши, тебе 17 знаков после запятой хватит
>>236442372 >Тред не читал, да? Сынок, если я буду читать треды вроде этого, то у меня не останется времени для зарабатывания 300к/нс. Учись задавать вопросы в оп-посте. Пока налил шампанское тебе под ёлку.
>>236442372 >как софт для ракеты написать, чтобы все максимально точно было? У тебя погрешность метода десятки процентов, а ты ебёшься с 17 знаком после запятой. Ты просто даун.
>>236442529 >>236442442 Ну это самый же дженерик пример, где плавающая арифметика не работает. А там будет дохуя сложная система и ошибка может получиться уже не в 17-м знакое, а во втором, например.
>>236442472 Заебись, я вино пью, правда, у меня елки нет.
>>236442372 Ну посох знает про софт для ракет. Там мб не чистые C++ используют, и уж точно не питон. А какие-нибудь матлабы мб и ансисы, где для инженегров нет нужды вникать почему 0.1 + 0.2 != 0.3, операторы сравнения за них переопределены этими программами и сравнивают разницу с EPS очень маленькой.
>>236442417 Ты ракетой в комариный посох попадать собираешься? Для всех практических применений достаточно 6 знаков после запятой. Для всего остального существуют изъебистые алгоритмы, которые использует 3.5 ученых по физике плазмы.
>>236442704 >Ну это самый же дженерик пример, где плавающая арифметика не работает. А там будет дохуя сложная система и ошибка может получиться уже не в 17-м знакое, а во втором, например. И че? У тебя выбор есть что ли? Так процессор работает. Может на арме по другому будет кста. И да, ты так и не сказал где конкретно тебе такая точность понадобилась. С хера ты решил что ракета это прямо супер пиздец точное оборудование, где 17 цифр не хватит?
>>236442704 >Ну это самый же дженерик пример, где плавающая арифметика не работает Никто никогда не использует арифметику точнее double в научных и инженерных расчётах, т.к. погрешность методов апроксимации больше погрешности машинной арифметики. Твой страх про 17 знак после запятой лишь признак глубокого невежества.
>>236442417 Ух бля, знал бы ты сколько допущений и гипотез принимают в инженерном деле, ты бы охуел. Там и так ошибка получается просто от метода вычислений значительная. Так что от неверного числа на 17 знаке вообще нихуя не изменится. Короче оп долбоеб и тралль иди свою мамку.
>>236442890 Слышь педвед, я для веба на PHP пишу. Здесь главное скорость написания кода и чтоб сегодня работало. Мне твоя мудянка с вычислениями реального времени вообще в посох не стучит. Ты когда на сайт заходишь себе пожрать заказать просто знай, что я его делал или человек вроде меня поэтому соси пипку.
>Слышь педвед, я для веба на PHP пишу. Здесь главное скорость написания кода и чтоб сегодня работало. Мне твоя мудянка с вычислениями реального времени вообще в посох не стучит. Ты когда на сайт заходишь себе пожрать заказать просто знай, что я его делал или человек вроде меня поэтому соси пипку. Ради подобного я и захожу в бэ
>>236443557 > реально работающие сервисы, которые многим облегчают жизнь > многим облегчают жизнь
Животное, все твои "сервисы" - всего лишь попил бабла заказчика, которому никто не сказал, что можно обойтись простым готовым решением, коих овердохуя.
>>236443557 Сервисы? Это вот этот симулякр и пузыри на рынке айти? Типа мобилки и веб? Ну заебись работа, что ж. Надеюсь, каждый день чувствуешь, что совершил какие-то великие, действительно важные дела.
Челы, которые дрочат на точность, идите изучите сопромат с его гипотезами и допущениями. При его неебической сложности для некоторых людей, он все равно дает ебейшую погрешность.
Машина не может конвертировать десятичную дробь в двоичную дробь без потери точности. Просто в силу того, что самая обычная десятичная дробь по типу 0,1 в двоичном представлении будет выглядеть как периодическая, т.е. 0,0 и далее 0011 до бесконечности.
Поэтому в таких случаях нужно применять фиксированную запятую, то есть буквально представлять дробную часть как ещё одно целое число. Разумеется, не руками, для этого есть отдельные типы данных, но всё же.
Язык программирования тут ни при чём, это фундаментальное ограничение двоичной арифметики.
>>236443692 Ой блядь, ваш сопромат дебильский это момент сил из физики. И вы все, сука, ноете, что не можете одну и ту же формулу осилить, дебилы, блядь.
>>236443729 Ну да, так-то и делают в точных приложениях. Определяют максимально допустимую точность и с ней работают потом. Молодец.
{ïîèñê ñëîâà â òåêñòîâî-áàéòîâîì ìàññèâå} procedure poisk (np,kp,napr:integer); var schp,schp2,schp3,kop,ooo,insovp:integer; begin sovp:=-1; schp:=np-2; kop:=kp-dlslo; ooo:=kop-1+np;
if (kp-np+1)<dlslo then begin showmessage('Ñëîâî äëèííåå ÷åì îáëàñòü ïîèñêà (dlslo='+inttostr(dlslo)+')'); sovp:=0 end; if (np<1) or (kp>dlmas) then begin showmessage ('Îáëàñòü ïîèñêà âûõîäèò çà ãðàíèöû ìàññèâà'); sovp:=0 end ; if dlslo<1 then begin showmessage ('Íóëåâàÿ äëèíà ñëîâà'); sovp:=0 end ;
while sovp<0 do begin schp:=schp+1; {schp2:=(kop+1)-((schp+1)-np)-1; } {schp2:=kop-1+np-schp;} if napr=1 then schp2:=schp else schp2:=ooo-schp; {showmessage('nach - '+inttostr(kop)+' kon - '+inttostr(kp)+' slovo - '+inttostr(dlslo)+' òåêïîç'+inttostr(schp2+1)); } {---} if schp=kop then sovp:=0; insovp:=0; for schp3:=1 to dlslo do if msslo[schp3]<>maste[schp3+schp2] then insovp:=insovp+1; if insovp=0 then sovp:=schp2+1; end; end;
{îöèôðîâêà ñëîâà} procedure ozslov(slovo:string); var ssloch:integer; begin dlslo:=length(slovo); for ssloch:=1 to dlslo do msslo[ssloch]:=ord(slovo[ssloch]); end;
{îöèôðîâêà òåêñòà} procedure oztekst (rgeoz:integer); {ðåæèì 1 - òåêñò slovo --- ðåæèì 2 - memo} var sstech:integer; begin if rgeoz=2 then mastekst:=form1.memo1.text; dlmas:=length(mastekst); for sstech:=1 to dlmas do maste[sstech]:=ord(mastekst[sstech]); end;
{ïåðåâîä ìàññèâà â òåêñò} procedure masvte(nzn,kzn:integer); var pmsh:integer; begin gotmas:=''; for pmsh:=nzn to kzn do gotmas:=gotmas+chr(maste[pmsh]); end;
ozslov(zna2); if rgept=1 then poisk(nacont,pzko,2) else poisk(nacont,pzko,1); kocont:=sovp-1; if sovp<1 then oshpt:=oshpt+1; end;
procedure zanvmas(ochisl:integer); var ssoovv,prov:integer; begin ssoovv:=0; if scetmas>0 then for prov:=1 to scetmas do if masid[prov]=ochisl then ssoovv:=1; {--} if ssoovv=0 then begin scetmas:=scetmas+1; masid[scetmas]:=ochisl end else kopovt:=kopovt+1;
end;
{ïîèñê ìåæäó id= è 13-10} procedure pop1; var okonp,npot,npot2,mmdms,mmddd:integer; begin scetmas:=0; kopovt:=0; prover:=0; okonp:=0; npot:=1; while okonp<1 do begin poizna (npot,dlmas,{'id='}'xx',{#13+#10}'yy',2); if oshpt=0 then begin masvte(nacont,kocont); zanvmas(strtoint(gotmas)); prover:=prover+1; npot:=kocont+1; if npot>=dlmas then okonp:=1; end else okonp:=1; end;
for npot:=1 to mmdms do begin for npot2:=1 to 5 do vremstper:=vremstper+'xx'+inttostr(masid[(npot-1)5+npot2])+'yy '; vremstper:=vremstper+#13+#10; end;
if mmddd>0 then for npot:=(mmdms5)+1 to scetmas do vremstper:=vremstper+'xx'+inttostr(masid[npot])+'yy ';
form1.memo1.text:=vremstper; end;
{ïîèñê ñðåäè äàóí2019} procedure pop2; var ikon,napoi,npk,mmdlls,npk2,mmdddll:integer; loool:string; begin scetmas:=0; kopovt:=0; prover:=0; ikon:=0; napoi:=1; npk:=1; ozslov(#13+#10);
while ikon<1 do begin poisk(npk,dlmas,1); if sovp>0 then begin masvte(npk,sovp-1); npk:=sovp+2; zanvmas(strtoint(gotmas)); prover:=prover+1; if npk>=dlmas then ikon:=1; end else ikon:=1; end;
maxrazmc:=razmerfc+1; {--- Ñáðàñûâàåì ñ íîâûì ðàçìåðîì çàïèñè è ÷èòàåì ôàéë ---} if maxrazmc<razmerfc then begin showmessage ('Îøèáêà - ðàçìåð ôàéëà ïðåâûøàåò âûäåëåííóþ äëÿ çàãðóçêè ïàìÿòü'); {oshchte:=1;} end else begin reset(failch,512); seek(failch,(blona-1)128); { showmessage(inttostr((blona-1)128)+'raa'+inttostr((blokon-1)128)); } {÷èòàåì áëîêàìè} if kolblokc>0 then for scetch:=blona to blokon do blockread(failch,maste[(scetch-blona)65536+smsch],128); {÷èòàåì îñòàâøèìèñÿ çàïèñÿìè} {if kolzapc>0 then blockread(failch,massfayl[kolblokc65536+smsch],kolzapc); } {÷èòàåì îñòàâøèåñÿ áàéòû} {if kolbaitc>0 then begin vrpch:=kolblokc65536+kolzapc512; reset(failch,1); seek(failch,vrpch); for scetch:=1 to kolbaitc do blockread(failch,massfayl[vrpch+smsch+scetch-1],1); end; } end; closefile(failch);
while kooy<1 do begin poisk(poiid,dlmas,1); if sovp>0 then begin {showmessage('ii'); } yaad1:=sovp-100; yaad2:=sovp+100; if yaad1<1 then yaad1:=1; if yaad2>5000000 then yaad2:=5000000; masvte(yaad1,yaad2); momymo:=momymo+inttostr(sovp+(nonono-1)65536)+' '+inttostr(round((sovp+(nonono-1)65536)/1024))+' '+gotmas+#13+#10; poiid:=sovp+10;
if poiid>=dlmas then kooy:=1; end else kooy:=1; end;
end;
procedure TForm1.Button1Click(Sender: TObject); begin {oztekst(2); poizna (1,dlmas,'rr','ll'); if oshpt=0 then begin masvte(nacont,kocont); showmessage(gotmas) end else showmessage ('òåãîâ íå íàéäåíî');
} oztekst(2); pop1;
end;
procedure TForm1.Button2Click(Sender: TObject); begin oztekst(2); pop2 ; end;
procedure TForm1.Button3Click(Sender: TObject); var rrr,uuq,uuqq:integer; begin momymo:=''; uuq:=strtoint(form1.edit1.text); uuqq:=strtoint(form1.edit3.text); for rrr:=uuq to uuqq do boloko(rrr) ;
>>236443846 >Ой блядь, ваш сопромат дебильский это момент сил из физики. И вы все, сука, ноете, что не можете одну и ту же формулу осилить, дебилы, блядь. Ну тем не менее, ты бы нихуя не понял в теоретической части сопромата. Может быть, ты бы смог применить алгоритмы решения задач, но объяснить, почему данный алгоритм тут применим, а другой нет ты не сможешь. Потому что ты такая же макака, как и остальные. Нахуй иди, в общем, затупок ебаный.
>>236444218 Я не макака. Ваш сопромат оливье для дебилов. Мне так знакомый физик-теоретик сказал. Да и баллы по ЕГЭ на факультетах, где есть сопромат, пиздец низкие. Короче, это хуйня для отребья.
>>236444148 Почему был? До сих пор же выходят новые версии и ими пользуются. Сам кодю на Дельфи 3, 1997 года. Ибо ломает устанавливать что-то другое.
И вообще, как по мне, язык программирования не важен если задачи не совсем уж специфические. Главное алгоритмы. Какая разница, будешь ты просчитывать растягивание видео на Дельфи, СИ, или вообще Яваскрипт. Делает-то всё процессор.
>>236444490 А нахуй ты тогда вообще пришел доказывать, что никто не может строить ракеты, потому что у вас числа неправильно складываются на комплюхтере?
>>236444460 >Почему был? До сих пор же выходят новые версии и ими пользуются. И чё? Для какого языка не выходят? Даже бейсик пилят какие-то шизы. >Сам кодю на Дельфи 3, 1997 года. Ибо ломает устанавливать что-то другое. >И вообще, как по мне, язык программирования не важен если задачи не совсем уж специфические. Главное алгоритмы. Это твой код? Зачем ты называешь переменные по-русски? Где хоть один комментарий?
>>236444579 >Это твой код? Зачем ты называешь переменные по-русски? Где хоть один комментарий? Мой. Комментарии все есть, только кодировка поломалась при копировании. Разве не видишь кракозябры в фигруных скобочках?
Переменные называю как удобно, я же для себя пишу. Каждая программа это основной код и десятки костылей при отладке. Когда пилишь костыли, нет времени думать над названиями. Нужно быстрее, пока не ушло вдохновение, писать хоть что-то. Поэтому счетчик цикла может называться nariman массив pipiska индикатор ошибки oooouuuu и так далее.
Вот короче через блокнот кусок кода скопировал, чтобы без кракозябр Эта подпрограмма грузит файл в байтовый массив. Чтобы всё работало максимально быстро, чтение идет блоками по 64 килобайта. Остаток читается записями по 512 байт. А то что не лезет даже в 512 приходится уже побайтово. Но это незаметно. По моему хороший код:
procedure zagrfail(imyafailach:string; smsch,maxrazmc:integer); {адрес файла, смещение для записи в массив (если запись с начала массива то 1), ограничение по размеру файла (предп. размер массива)} var failch:file; {файловая переменная} razmerfc,kolblokc,kolzapc,kolbaitc:integer; {размер файла в байтах, количество целых блоков, количество оставшихся целых записей, количество оставшихся байт} scetch,vrpch:integer; {счетчик циклов чтения,временная переменная} begin
{--- первоначальные присваивания ---} assignfile(failch,imyafailach); {присвоение файловой переменной} filemode:=0; {режим "только чтение"} reset(failch,1); {открытие файла для того чтобы узнать размер в байтах} razmerfc:=filesize(failch); {узнаем размер в байтах} oshchte:=0; {обнуление ошибки чтения}
{--- подсчет количества блоков, записей, и оставшихся байт ---} kolblokc:=round(int(razmerfc/65536)); kolzapc:=round(int((razmerfc-kolblokc65536)/512)); kolbaitc:=razmerfc-kolblokc65536-kolzapc512; {--- Сбрасываем с новым размером записи и читаем файл ---} if maxrazmc<razmerfc then begin showmessage ('Ошибка - размер файла превышает выделенную для загрузки память'); oshchte:=1; end else begin reset(failch,512); {читаем блоками} if kolblokc>0 then for scetch:=1 to kolblokc do blockread(failch,massfayl[(scetch-1)65536+smsch],128); {читаем оставшимися записями} if kolzapc>0 then blockread(failch,massfayl[kolblokc65536+smsch],kolzapc); {читаем оставшиеся байты} if kolbaitc>0 then begin vrpch:=kolblokc65536+kolzapc*512; reset(failch,1); seek(failch,vrpch); for scetch:=1 to kolbaitc do blockread(failch,massfayl[vrpch+smsch+scetch-1],1); end; end; closefile(failch);
globrazmf:=razmerfc; {присваиваем глобальной переменной размер файла} end;
>>236438938 (OP) Надо учесть что в множество вещественных чисел входя дробные, иррациональные, целые. То есть класс чисел надо реализовать с учетом множества, которому принадлежит число. Я бы наверное сделал интерфейс, перегрузил в нем операцию +. Все целые, дробные, иррациональные сложил бы по отдельности. Посмотрел в конце можно ли сумму дробных/иррациональных перевести в класс целых. Сгруппировать. Результат бы выписал в двух представлениях. Символьных. Это результат после группировки. Числовой, с точностью до настройки программы/операционной системы/железа.
>>236445217 >А потом через месяц вспомнишь, что ты там нахуевертил? для того костыли и пилятся, чтобы учесть все возможные ситуации приводящие к ошибкам. Когда больше ничего не сбоит, можно просто вызывать эту подпрограмму не задумываясь над тем что у неё внутри. Главное результат который она выдаст.
Хотя конечно, ради эстетики и перфекционизма, можно потом и вылизать всё под чаек, подправив код и нормально всё переименовав и прокомментировав.
Просто чаще я делаю что-то для мимолетных нужд. Спарсить альбом с фоточками из вконтакта, грубо проверить скачанную БД на нужную фамилию, переименовать кучу файлов автоматом и т.д.
>>236446056 Нет. Иррациональные это R без Q. С помощью компьютерной алгебры можно это все сложить. Или привести к одному типу. Это все от требований зависит. Обучающую какую-то ведь или отчет я бы представлял только символьно. Моделирование процессов конечно с максимально доступной для окружения точностью.
>>236446540 Хоспате, какие же зумеры дегенераты. Повкатываются в это айти, потом нахуй сайты не грузятся и игры лагают. Иди на завод лучше, ладно? 0.3000000000000000004 - это выдает процессор. Что там твой ебаный язык ОКРУГЛЯЕТ уже не имеет значения.
>>236438938 (OP) пиздец, блять, почитал тред и начисто пропало желание заниматься питонированием. Какие блять группы точность, округления и прочее? В любом нормальном язык сказал, что тип переменной с плавающей запятой и поехал ебать
>>236438938 (OP) А что еще нужно учесть для переменных в общем виде? Следи за переполнением переменной куда сумму будешь складывать, реши до какой цифры для тебя приемлемая точность. Собсно все.
>>236446662 Ну и какой из тебя программист тогда, макака ебаная? Проблема с вещественными на любом языке, это нюанс того как вещественные вообще в памяти хранятся, а не какого-либо языка.
Сложение чисел с плавающей запятой не ассоциативно. Вроде бы числа с плавающей запятой даже образуют какую-то особую алгебраическую структуру тип кольцо какое-то особенное
>>236438938 (OP) У чисел с плавающей запятой есть epsilon - такое число, которое не поменяет единицу, т.е. 1+ε=1
Понятно, что 0.1+ε уже не равно 0.1 (потому что для 0.1 таким числом, его не меняющим, будет 0.1ε).
Очевидно, что если ты сто раз прибавишь ε к 1, ты получишь 1. А вот если ты сначала сложишь все ε, а потом прибавишь к 1, ты получишь правильный результат.
Для соблюдения максимальной точности тебе надо складывать всегда числа, максимально близкие друг к другу по модулю.