Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.71 MB
Время: 0.059 c
2-1339859764
NBAH1990
2012-06-16 19:16
2013.03.22
Получение информации с фэйсбука


2-1331284249
rraktir
2012-03-09 13:10
2013.03.22
Как сделать маску ввода под проценты?


2-1331979813
>|<
2012-03-17 14:23
2013.03.22
DrawFocusRect


2-1330876757
TSubject
2012-03-04 19:59
2013.03.22
Ошибка при выполнении запроса в Oracle


15-1354344006
AlexDn
2012-12-01 10:40
2013.03.22
Компонент для работы с графикой