Текущий архив: 2013.03.22;
Скачать: CL | DM;
Вниз
Теоретически можно брать байты из файла и выполнять как код? Найти похожие ветки
← →
Юрий Зотов © (2012-10-04 15:10) [80]
> Rouse_ © (04.10.12 14:06) [65]
> при изменении одного единственного числа или формулы в большинстве
> случаев приходится пересчитывать практически все
То есть, смету фактически считает калькулятор, а не сама программа?
← →
Rouse_ © (2012-10-04 15:18) [81]Калькулятор рассчитывает результат формулы, точнее даже не так, там над ним еще один механизм стоит, который передает ему данные ибо формулу можно вычислить только в том случае когда рассчитаны все ее параметры, вот как в примере выше, для того чтобы расчитать значение Ex нужно получить результаты F308 и F611, а чтобы их получить, нужно рассчитать результаты формул входящих в их состав и т.п. пока формулы не кончатся :)
← →
Inovet © (2012-10-04 15:23) [82]> [67] картман © (04.10.12 14:18)
> Скажем, телебашня Останкино - я не строитель, но рискну
> предположить, что там больше сотни другой позиций
Имхо, порядками ошибся. Сидело 100 человек и считали, да и проще был расчёт, скорее всего.
← →
Inovet © (2012-10-04 15:30) [83]> [78] AV © (04.10.12 15:01)
> т.е. если один компонент изделия стоит невообразимо больше,
>
> то где же логика считать копейки, отбрасывая при этом тысячи..
Задо копеечных невообразимо много.
← →
Игорь Шевченко © (2012-10-04 16:01) [84]Rouse_ © (04.10.12 15:18) [81]
Excel изобрели ?
← →
Inovet © (2012-10-04 16:07) [85]> [84] Игорь Шевченко © (04.10.12 16:01)
> Excel изобрели?
Однако в Excel сметы вряд ли считают. Да и медленный он.
← →
Rouse_ © (2012-10-04 16:10) [86]
> Игорь Шевченко © (04.10.12 16:01) [84]
> Excel изобрели ?
Ну в принципе да, только оптимизированный под конкретную задачу.
> Inovet © (04.10.12 16:07) [85]
> Однако в Excel сметы вряд ли считают. Да и медленный он.
Нет, как раз маленькие сметки в экселе и считают, а когда нужно уже что-то серьезное, тогда народ и смотрит в сторону покупки специализированного сметного ПО.
← →
Inovet © (2012-10-04 16:15) [87]> [86] Rouse_ © (04.10.12 16:10)
> Ну в принципе да, только оптимизированный под конкретную задачу.
Так о любом расчётном ПО можно сказать.
> [86] Rouse_ © (04.10.12 16:10)
> Нет, как раз маленькие сметки в экселе и считают
Что-нибудь вроде ремонта санузла?
← →
Rouse_ © (2012-10-04 16:16) [88]
> Что-нибудь вроде ремонта санузла?
Это лучше у самих сметчиков спрашивать :)
← →
картман © (2012-10-04 16:21) [89]
> Rouse_ © (04.10.12 15:04) [79]
> Ex := (F308 + F611) * 0.1 * 0.01;
а почему Ех не округляется?)))
> http://rouse.drkb.ru/other.php#roundВторая, SimpleRoundTo_Str - является эталоном, т.к. производит округление при помощи строк и на нее не действют<b/> погрешности.
описка
← →
han_malign (2012-10-04 16:42) [90]
> SimpleRoundTo_Str - является эталоном
- блин, в деньгах не те порядки чисел - там все в обыкновенных дробях легко считается - весь мировой ВВП, если не зимбабвийских долларах...
← →
Rouse_ © (2012-10-04 16:48) [91]
> а почему Ех не округляется?)))
А вот с ним то как раз и была проблема.
Ex принимает значение 51,82235, которое при использовании стандартного SimpleRoundTo или нашей предыдущей реализации GsSimpleRoundTo выдаст неверный результат.
Т.е.Writeln(FloatToStr(SimpleRoundTo(Ex, -4))); // 51,8223
а должно быть 51,8224
> и на нее не действют<b/> погрешности.
угу, спасибо, поправил...
← →
Игорь Шевченко © (2012-10-04 16:51) [92]Rouse_ © (04.10.12 16:10) [86]
> Ну в принципе да, только оптимизированный под конкретную
> задачу.
Это надо будет потом посоветоваться как-нибудь. Имеются похожие задачи, оцениваются разные подходы.
← →
Inovet © (2012-10-04 17:05) [93]> [82] Inovet © (04.10.12 15:23)
> Сидело 100 человек и считали
Какой-то фильм был как обруч изобрел один пацан и предложил заводу изготавливать, назвали хулла-хуп, провели рекламную раскрутку заработали миллионы. Так там бухгалтерия расчитывала стоимость этого изделия. Цех со спротзал, в нём столы, за столами бухглтеры с арифмомерами или счётами даже. Междц ними ходит главный бухгалтер, его помошники каие-то промежуточные итоги сводят от соих подчинённых. Наконец приносят ему киппы бумаг, тот к себе в огромную книгу переписывает, считает. В завершение утирает пот, крупным планом показывает в книге bottom line и под ней его рука выводит что-то вроде 5.12. Несёт дирректорам, те отрицательно качают головой - много, дескать. Главбух при них зачёркивает и пишет 3.64. Все рады. Начинают производство и продажи.
← →
Rouse_ © (2012-10-04 17:06) [94]
> Игорь Шевченко © (04.10.12 16:51) [92]
> Это надо будет потом посоветоваться как-нибудь. Имеются
> похожие задачи, оцениваются разные подходы.
Не вопрос, но в таких вещах лучше будет тебя с Максимом Черных свести, он на порядок подкованней в этих вопросах, чем я :)
← →
Rouse_ © (2012-10-04 17:53) [95]
> han_malign (04.10.12 16:42) [90]
>
>
> > SimpleRoundTo_Str - является эталоном
>
> - блин, в деньгах не те порядки чисел - там все в обыкновенных
> дробях легко считается
Порядки не те, но не приятно когда даже в тысячных происходит ошибка округления (как в вышеописанном примере).
Кстати был у нас забавный случай, от нас требовали расширить количество цифр после запятой, в том числе и при округлении. Начали спрашивать, сколько цифр за запятой хотите? Сказали 15 (пятнадцать! За запятой!!!)
Ну в принципе хоть двадцать - нам то че, а что будете измерять с такой точностью? Сказали бетон! Мол в позиции он задается в тоннах, хотим 15 знаков за запятой :))) На наше уточнение, что даже если они будут вводить количество бетона с точностью до грамма, будет достаточно 6 цифр за запятой, они всеравно настаивали что нужно 15 (я даже не знаю как эта цифра называется 1 в минус 15-ой степени).
← →
Inovet © (2012-10-04 18:03) [96]> [95] Rouse_ © (04.10.12 17:53)
Двоечники они. И что, вы ради них изменили?
← →
Rouse_ © (2012-10-04 18:20) [97]
> Inovet © (04.10.12 18:03) [96]
> Двоечники они. И что, вы ради них изменили?
Ничего не поменяли :)
зы: > han_malign (04.10.12 16:42) [90]
щас кстати покажу одну штуку, мин 10, код причешу только...
← →
Rouse_ © (2012-10-04 18:57) [98]
> han_malign (04.10.12 16:42) [90]
Так вот, фишка данного алгоритма в его высокоточночти, т.е. исправлении погрешности матсопроцессора, а не в том что он может работать с 30 знаками за запятой. Причем данная погрешность может возникнуть даже на числе 0.5.
Вот тут я накатал небольшой пример: http://rouse.drkb.ru/tmp/11.zip
Там все сильно утрировано и притянуто за уши, но рассмотрим простейшую ситуацию. Мы хотим построить пятиэтажный кирпичный дом и забиваем в смете стоимость укладки кирпича (как там в действительности не знаю) и наша программа случайно дает погрешность на полрубля (из-за ошибки такого округления формулы) а полрубля - это нормальный диапазон.
После чего мы говорим что готовы построить дом за такую стоимость и выигрываем тендер. Начинаем строить и тут опа, выясняется что из-за погрешности мы обьявили заниженную стоимость работ и реально попадаем на полтора миллиона рублей.
Оть как раз такая ситуация и рассмотрена в примере, а все из-за того что чуть-чуть не правильно округлили.
ЗЫ: ну о пятьже с оговорками кол-во кирпича и стоимость укладки примерные (я смотрел по ценам укладки куба и подводил формулу с учетом что в кубе 440 кирпичей)
Оть такой вот нюансик...
← →
Rouse_ © (2012-10-04 20:27) [99]
> Inovet © (04.10.12 18:03) [96]
> Двоечники они. И что, вы ради них изменили?
Кстати по поводу двоечников, что-то опять же случайно впомнилось. Один из самых популярных запросов в техподддержку это вопрос о том что сумма по смете не сходится. Присылаются сметы, скриншоты в которых все поля старательно обведены, отдельно присылается расчет ручками и обвинение - вы не правильно считаете :)
У нас у начальника службы ТП даже специальный шаблон заготовлен с цитатой: "Сумма округленных величин не всегда равна округленной сумме этих величин. Округление чисел (5 класс)"
← →
картман(зп) (2012-10-04 20:41) [100]//WrongPrice := (SimpleRoundTo(Ex, -4) * 1000 - 51820) * 15;
WrongPrice := Ceil( (Ex * 1000 - 51820) * 15);
36
я ж говорю, всегда надо округлять в большую сторону:)
← →
Rouse_ © (2012-10-04 20:59) [101]
> картман(зп) (04.10.12 20:41) [100]
Ну это как уж пользователь формулу введет, ему то все варианты доступны :)
Кстати даже после этого изменения обрати внимание на "Разница: -2,26864358410239E-8" что опять указывает на наличие погрешности :)
← →
картман(зп) (2012-10-04 21:06) [102]
> опять указывает на наличие погрешности :)
у меня вылетает на SimpleRoundTo_Asm - XE, win7 64, глянуть не могу, но да бог с ней.
Эту погрешность придумали люди - сметчики, а по сути ошибки нет. Математической нет, есть человеческая, т.е. с помощью таких округлений вычисления подгоняются под человеческое понимание "как оно там должно быть". ИМХО(но уверен в этом на 95%)
← →
Rouse_ © (2012-10-04 21:15) [103]
> у меня вылетает на SimpleRoundTo_Asm - XE, win7 64, глянуть
> не могу, но да бог с ней.
А вот это плохо, я правда тестировал на D7/2007/2010 и чес говоря не должно на других вылетать. Проверю тогда на триалке.
А по поводу того что ошибки нет - тут ты не прав, о чем собственно и пишется в интеловском мануале, сопроцесор работает с допустимой погрешностью, там даже где-то границы погрешностей рассматривались и её причины.
Дабы убрать эту погрешность - пришлось разбираться с тем как числа представлены в самом матсопроцессоре и править их, уводя от границ, на которых будут проявляться артефакты вида 0.5 <> 0.5
← →
картман(зп) (2012-10-04 22:05) [104]
> пишется в интеловском мануале, сопроцесор работает с допустимой
> погрешностью, там даже где-то границы погрешностей рассматривались
> и её причины.
о, насчет этого не спорю, говорю лишь, что 36 руб/кирпич - не математическая цена, а человеческая, математическая же она получилась 35.25. Вообще не понимаю всей этой беготни с округлениями - если процессор считает с точностью до энного знака после запятой, как можно умудриться на выходе получить погрешность порядка процентов??? Вот именно - надо умудриться.
← →
картман(зп) (2012-10-04 22:18) [105]или ты о том, что если я сейчас посчитаю эту формулу столбиком, у меня получится 36 ровно(или очень близко)?
← →
Rouse_ © (2012-10-04 22:30) [106]
> если процессор считает с точностью до энного знака после
> запятой, как можно умудриться на выходе получить погрешность
> порядка процентов??? Вот именно - надо умудриться.
Не передергивай, погрешность вылазит на границе пятерки - возможности железа.
Калькулятор считает то, что ввел пользователь.
В примере показана ошибка, к которой можно прийти определенным способом составив формулу, причем ошибка то не из-за неверно составленной формулы - формулы в любом случае всегда правильны, это как аксиома, а влияние, оказывающее на конечный результат погрешностью железа.
То что нужно еще умудрится - это да, а потом сидеть и обьяснять пользователю, что мол понимаете, ну не считает у нас сопроцессор так как оно должно быть.
И опять же в том-же примере показано, что могу сделать я сам, чтобы не сидеть и не обьяснять юзверю что на самом деле числа с плавающей запятой у нас хранятся не так как они печатаются на экране...
А по поводу как из 35.25 получается 36 - для этого и придуманы чиновники генерирующие пачками методики описывающие в каком случае нужно округлить прежде чем умножить, где сначала нужно сложить перед тем как поделить, а где сначала умножить а потом сложить :)
Если мы не будет делать так как ими написано - нас покупать никто не будет.
← →
картман(зп) (2012-10-04 22:42) [107]теперь все ясно:)
← →
Дмитрий С © (2012-10-05 00:29) [108]
> Сидело 100 человек и считали, да и проще был расчёт, скорее
> всего.
Это ж сколько ваша контора дармоедов без работы оставила :))
← →
Inovet © (2012-10-05 01:14) [109]> [99] Rouse_ © (04.10.12 20:27)
> У нас у начальника службы ТП даже специальный шаблон заготовлен
> с цитатой: "Сумма округленных величин не всегда равна округленной
> сумме этих величин. Округление чисел (5 класс)"
Это многие не понимают, а если и понимают, то всё равно думают - что-то здесь нечисто, это из-за того что в программе так считается.
← →
Inovet © (2012-10-05 01:26) [110]> [98] Rouse_ © (04.10.12 18:57)
А чем не устраивает DecimalRounding_JH1?
← →
Юрий Зотов © (2012-10-05 01:35) [111]Есть 2 суммы S1 и S2. И есть коэффициент индексации K. Все три значения прописаны в федеральном законе.
Теоретически должно быть так: S2=K*S1. Но не получается, потому что S1 и S2 имеют по 8 десятичных знаков, а K округлили до 4-х знаков. Ясное дело, разница между S2 и произведением K*S1 начинается тоже в 4-м знаке.
Как проводить индексацию? Предлагаю: давайте я рассчитаю точное значение K=S2/S1 и его буду использовать. Отвечают: нет, так нельзя, потому что противоречит закону. K надо брать таким, как в нем сказано.
ОК, тогда давайте будем использовать S2 равное K*S1. Отвечают: так тоже нельзя, потому что тоже противоречит закону. S2 надо брать таким, как в нем сказано.
Тупик. И возникает вопрос: те, кто принимал такой закон - они хотя бы в начальной школе вообще-то учились? И хоть раз по арифметике больше двойки получали?
← →
картман(зп) (2012-10-05 01:50) [112]
> И хоть раз по арифметике больше двойки получали?
"по арифметике" лишнее
← →
Inovet © (2012-10-05 02:07) [113]> [111] Юрий Зотов © (05.10.12 01:35)
> те, кто принимал такой закон
В законах стали, спустя несколько лет, учитывать округления. Но тоже странно. Например, по одному человеку допускается погрешность 0.01 рублей в месяц. Ладно, то что на предприятии на внутренних округлениях погрешность, бывает, больше накапливается, не должно влиять, пусть. Но в то же время итог по всем не должен превышать 1 рубль, как за месяц, так и за год. таким образом при численности свыше 100 человек закон противоречив. В реальности оно, конечно, распределяется в обе стороны и укладывается в допуск, но может быть такое, что и не уложится. Что делать тогда? А просто взять и эти 0.01 рублей у некоторых в другую сторону вручную поправить, закон же это допускает.
← →
Германн © (2012-10-05 02:07) [114]
> Округление чисел (5 класс)
И у меня тоже порой возникают очень сложные(точнее трудно понятные) проблемы из-за округления.
Но в 5-том классе их не поймёт никто :)
← →
Inovet © (2012-10-05 02:13) [115]> [113] Inovet © (05.10.12 02:07)
> так и за год
нет, за год - это я соврал.
← →
han_malign (2012-10-05 08:52) [116]
> фишка данного алгоритма в его высокоточночти
- дык я не о том, а о натуральных дробях - (N1+...+Nk)/100
- в приведенной задаче все считается в целых числах, а потеря точности на RoundToDecimal(var Numerator, var Denominator, Digit) - с возвратом знаменателя к 10^x - абсолютно управляема...
Если бы не F6xx в которых знаменатель 100000000 получается ((n1/100)*(c/1000)*(n2/1000)) - можно было бы и Currency обойтись.
← →
han_malign (2012-10-05 09:05) [117]и bigint не надо, в крайнем случае(для 15 знаков после запятой) - 3 int64 на представление смешанной дроби...
Страницы: 1 2 3 вся ветка
Текущий архив: 2013.03.22;
Скачать: CL | DM;
Память: 0.7 MB
Время: 0.068 c