powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
25 сообщений из 276, страница 9 из 12
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285790
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaDima TПоявилась мысль как сделать сравнимым double - округлять по окончанию расчета до необходимого количества знаков, но не более 15-ти, т.е. 14 после запятой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
char* double2hex(double x, char* buf) {
	sprintf(buf + 1, "%016llX", *((uint64_t*)&x));
	buf[0] = buf[1];
	buf[1] = buf[2];
	buf[2] = buf[3];
	buf[3] = '-';
	return buf;
}

int main()
{
	char buf[256];
	double x = 1.123456789012345;
	printf("x = %.15f %s\n", x, double2hex(x, buf));

	double y = 1.123456789012346;
	printf("y = %.15f %s\n", y, double2hex(y, buf));
	x = round(x * 1E14) / 1E14;
	printf("round(x) = %.15f %s\n", x, double2hex(x, buf));
	y = round(y * 1E14) / 1E14;
	printf("round(y) = %.15f %s\n", y, double2hex(y, buf));

	return 0;
}


Результат
Код: plaintext
1.
2.
3.
x =        1.123456789012345 3FF-1F9ADD3746F63
y =        1.123456789012346 3FF-1F9ADD3746F67
round(x) = 1.123456789012350 3FF-1F9ADD3746F79
round(y) = 1.123456789012350 3FF-1F9ADD3746F79

т.е. надо сделать тип, который кроме значения содержит точность, например при умножении точности складываются, при делении устанавливается максимально возможная для результата и т.д. Тогда можно проверять на равенство, т.е. это будет полноценный числовой тип. Да и NULL там есть, в смысле NaN.

Или как минимальный вариант: просто сделать функцию округления до заданного количества десятичных знаков и функцию сравнения, которая при проверке равенства округлит очень близкие значения.

Другой вопрос как затестить, 10^15 уже многовато для перебора, а тут еще варианты с разным количеством знаков после точки 14.1, 13.2, 12.3 и т.д.

:) у меня на Delphi еще в 99-м году была написана библиотека, с чудными функциями round2(), round100()

фактически да, так и было, любые попытки вычислить sum := round2(price * amount);

причем round2 был написан очень хитро, с замглавбуха делали отдельное регрессионное тестирование, перебрав практически все числа. просто чтоб копейки сходились.
и все равно пришлось прикручивать еще и финальную коррекцию на сумму счета.

в общем трах был незабываемый.

что-то вроде этого

Код: pascal
1.
2.
3.
4.
5.
6.
function RoundCorrect(R: Real): LongInt;
begin
  Result:= Trunc(R);       // extract the integer part 
  if Frac(R) >= 0.5 then   // if fractional part >= 0.5 then...
    Result:= Result + 1;   // ...add 1
end;



В Delphi нет функций ceil и floor?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285990
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСклоняюсь к мысли вести учет в копейках. int32 для цен, int64 для сумм. Как вариант может не экономить и int64 для цен тоже. Есть нагрузка из-за форматирования на входе-выходе, но тут надо потестить. У меня самодельные ToString()/FromString().

цена может быть в сотых, и даже миллионных долях копеек, запросто.
классический случай - это счет фактура на ранее произведенную предоплату.

цена вычисляется там обратным путем - делится общая сумма на общее количество
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286000
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurynojavaпропущено...


:) у меня на Delphi еще в 99-м году была написана библиотека, с чудными функциями round2(), round100()

фактически да, так и было, любые попытки вычислить sum := round2(price * amount);

причем round2 был написан очень хитро, с замглавбуха делали отдельное регрессионное тестирование, перебрав практически все числа. просто чтоб копейки сходились.
и все равно пришлось прикручивать еще и финальную коррекцию на сумму счета.

в общем трах был незабываемый.

что-то вроде этого

Код: pascal
1.
2.
3.
4.
5.
6.
function RoundCorrect(R: Real): LongInt;
begin
  Result:= Trunc(R);       // extract the integer part 
  if Frac(R) >= 0.5 then   // if fractional part >= 0.5 then...
    Result:= Result + 1;   // ...add 1
end;



В Delphi нет функций ceil и floor?

есть, а толку, они считают "неверно"

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Math.Floor
http://docwiki.embarcadero.com/Libraries/Seattle/en/System.Math.Ceil

бухгалтерам нужно строго half round up округление
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286065
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Различные виды округления в Java (BigDecimal)

BigDecimalHALF_UPHALF_DOWNHALF_EVENFLOORCEILING10.00110.0010.0010.0010.0010.0110.00210.0010.0010.0010.0010.0110.00310.0010.0010.0010.0010.0110.00410.0010.0010.0010.0010.0110.00510.0110.0010.0010.0010.0110.00610.0110.0110.0110.0010.0110.00710.0110.0110.0110.0010.0110.00810.0110.0110.0110.0010.0110.00910.0110.0110.0110.0010.0110.01010.0110.0110.0110.0110.0110.01110.0110.0110.0110.0110.0210.01210.0110.0110.0110.0110.0210.01310.0110.0110.0110.0110.0210.01410.0110.0110.0110.0110.0210.01510.0210.0110.0210.0110.0210.01610.0210.0210.0210.0110.0210.01710.0210.0210.0210.0110.0210.01810.0210.0210.0210.0110.0210.01910.0210.0210.0210.0110.0210.02010.0210.0210.0210.0210.02
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286067
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
BigDecimal sum = BigDecimal.TEN;
        BigDecimal inc = new BigDecimal("0.001");
        printf("[CSV]");
        printf("BigDecimal,HALF_UP,HALF_DOWN,HALF_EVEN,FLOOR,CEILING\n");
        for(int i=0;i<20;i++){
            sum = sum.add(inc);
            printf("%s,%s,%s,%s,%s,%s\n",
                    sum,
                    sum.setScale(2,BigDecimal.ROUND_HALF_UP),
                    sum.setScale(2,BigDecimal.ROUND_HALF_DOWN),
                    sum.setScale(2,BigDecimal.ROUND_HALF_EVEN),
                    sum.setScale(2,BigDecimal.ROUND_FLOOR),
                    sum.setScale(2,BigDecimal.ROUND_CEILING));
        }
        printf("[/CSV]");

...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286091
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaцена может быть в сотых, и даже миллионных долях копеек, запросто.
классический случай - это счет фактура на ранее произведенную предоплату.

цена вычисляется там обратным путем - делится общая сумма на общее количество
Вообще-то для этого придуман счет на оплату где изначально цена и количество прописываются. Так что это не классический случай, а обычный бардак.
Но можно и по другому подогнать сумму. Несколькими ценами. Например сумма 3 коп, отгрузили 2 шт. Пишем 1 шт * 1 коп + 1 шт. * 2 коп.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286159
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tnojavaцена может быть в сотых, и даже миллионных долях копеек, запросто.
классический случай - это счет фактура на ранее произведенную предоплату.

цена вычисляется там обратным путем - делится общая сумма на общее количество
Вообще-то для этого придуман счет на оплату где изначально цена и количество прописываются. Так что это не классический случай, а обычный бардак.
Но можно и по другому подогнать сумму. Несколькими ценами. Например сумма 3 коп, отгрузили 2 шт. Пишем 1 шт * 1 коп + 1 шт. * 2 коп.

тоже мне теоретик. этот счет на оплату могут оплатить и частично, и разными частями, или вообще заплатить больше, чем было выставлено.
бардак не бардак, а реалии жизни - и всем плевать на твои представления о порядке, ты должен отразить в базе данных свершившившуюся бизнес-операцию, а не теоретизировать.

а вот насчет можно - можно сходить в кабинет главбуху, там тебе популярно пояснят, что можно, а что нельзя :)

с занесением в переменную часть ЗП. или вынесением.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286192
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaбардак не бардак, а реалии жизни
У меня другие реалии, такого бардака нет и не ожидается. А насчет "главбух объяснит" - сочувствую тебе и тем кто этот товар будет приходовать и учитывать.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286276
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУ меня другие реалии, такого бардака нет и не ожидается.
теоретик
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286303
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилтеоретик
Не, практик, успешный убалтыватель главбухов
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286378
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропилтеоретик
Не, практик, успешный убалтыватель главбухов
который в своём уютном гнёздышке не знает, что такое суммовая разница,недопоставка, частичная отгрузка, пересорт
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286401
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima Tпропущено...

Не, практик, успешный убалтыватель главбухов
который в своём уютном гнёздышке не знает, что такое суммовая разница,недопоставка, частичная отгрузка, пересорт
Это решаемые проблемы: допоставка, переделка документов, возврат. Про суммовую разницу не понял о чем речь.
Ты удивишься, но я даже знаю о такой багофиче ПБУ как учет НДС на сумму в опте и на штуку в рознице, видел 3 типа кульбитов свести арифметику в счет-фактуре. Про дробление упаковок знаю, когда надо продать 1/3 упаковки ценой 30 р и чтобы вышло в чеке ровно 10 р.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286444
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы щас спорите не об округлении а о ролях и отвественностях на проекте.
Это офтопик. Давайте не будем. Каждый из вас по своему прав.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39286476
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВы щас спорите не об округлении а о ролях и отвественностях на проекте.
Это офтопик. Давайте не будем. Каждый из вас по своему прав.
Опередил. Можно закончу и больше не буду.

Суть проблемы с копейками в том что никак законодательно не урегулированы правила округления (да и расчета тоже) в обязательных документах. В законодательстве такая мелочь просто не упоминается, а всякие разъяснения по этому поводу от контролирующих органов могут быть проигнорированы судом. Например есть законодательное ограничение наценки на конкретный товар 20%. Купил за 12,34 р наценил 20% получил 14.808. Сделав цену 14.81 можешь запросто попасть под раздачу т.к. 14.808 < 14.81. Тут хотя бы боле-мене очевидно.
Сложнее если какому-нибудь "главбуху"-перестраховщику шибанет в голову и он прикажет - сделай так чтобы сумма с НДС была равна сумме колонки и сумме без НДС * ставку (предположим что все товары по одной ставке). Вот вам на ровном месте 4 знака после запятой в сумме НДС по строке. Только копейки все-равно вылезут, пусть в конкретном документе все идеально, т.к. итого с ндс все равно округлять надо, т.к. ни один банк не проведет платеж на 100.1234 р. А в итоге эти округления родят расхождение в отчете по НДС за период, где будет сумма без НДС * ставку НДС != сумма НДС. Поэтому два пути решения проблемы:
1. тупо сказать "есть" пойти расширять разрядность после запятой, создавая проблемы стороне которая эти документы будет приходовать.
2. убедить что это не поможет, и поискать совместно устраивающее всех решение.

Не зря пишут в умных книжках что ИТ должны подчиняться непосредственно высшему руководству предприятия, а не зависеть о каких-то отделов предприятия. Главбух не должен быть выше начальника ИТ.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288617
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения коллеги. На меня нахлынули размышления.

Не знаю совсем-ли это по сабж. Смотрел вторую часть научно популярного видео
о масштабах вселенной. Впечатлило. Задумался о измеряемых величинах.

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288621
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПрошу прощения коллеги. На меня нахлынули размышления.

Не знаю совсем-ли это по сабж. Смотрел вторую часть научно популярного видео
о масштабах вселенной. Впечатлило. Задумался о измеряемых величинах.

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288624
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинКогда вся известная вселенная это от 10^-16 метра до 10^24 метра, т.е. всего 40 десятичных порядков.
Ну не совсем.
Размер вселенной оценивается в 46 млрд световых лет == 43e25 м
Минимальный размер которым может оперировать физика на данный момент, планковский - 1.5e-35 м

Т.е. порядков 70.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288625
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyТ.е. порядков 70.
Упс, рука дрогнула - 60
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288629
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со ссылкой на флеш-ролик

http://www.contenton.ru/geo-size-universe/

Размер нейтрино: 10^-24 метра
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288630
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соотношение диаметра обозримой вселенной 10^24 к размеру нейтрино 10^-24 будет
равно 10^48.

Это больше чем диапазон float (32bit).
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288631
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинКогда вся известная вселенная это от 10^-16 метра до 10^24 метра, т.е. всего 40 десятичных порядков.
Ну не совсем.
Размер вселенной оценивается в 46 млрд световых лет == 43e 25 м
Минимальный размер которым может оперировать физика на данный момент, планковский - 1.5e -35 м

Т.е. порядков 70.
Anatoly MoskovskyAnatoly MoskovskyТ.е. порядков 70.
Упс, рука дрогнула - 60
Но даже так от 10^-35 до 10^26 вписывается в экспоненту в 8-bit из float от 10^-38 до 10^38.
Чего им в double экспоненту захотелось в 8 раз увеличивать...
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288758
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я еще дальше покрутил флеш-ролик. Ну вобщем на уровне размеров 10^-35 м.
физики различают такие вещи как планковская длина, кварковая пена e.t.c.

Поскольку я не физик то не знаю как часто они меряют или сравнивают эти величины.

Включать ли такое измерение в нашу оценку или нет - ХЗ.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288821
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинAnatoly Moskovskyпропущено...

Ну не совсем.
Размер вселенной оценивается в 46 млрд световых лет == 43e 25 м
Минимальный размер которым может оперировать физика на данный момент, планковский - 1.5e -35 м

Т.е. порядков 70.
Anatoly Moskovskyпропущено...

Упс, рука дрогнула - 60
Но даже так от 10^-35 до 10^26 вписывается в экспоненту в 8-bit из float от 10^-38 до 10^38.
Чего им в double экспоненту захотелось в 8 раз увеличивать...

ой да ладно, вон в ipv6 не особо парясь вписали 128 бит на адрес, что достаточно для адресации каждого кубического миллиметра во Вселенной.

на кой?

и они как-то же обосновали свое "решение"

мир ит захватили шарлатаны
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288981
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava не особо парясь вписали 128 бит на адрес, что достаточно для адресации каждого кубического миллиметра во Вселенной.

на кой?

и они как-то же обосновали свое "решение"

мир ит захватили шарлатаны
Меня тоже очень сильно удивило подобное расточительство. Казалось-бы увеличь сетку с 32 бит до 64 и получай
себе избыточную разрядность для всех устройств планеты Земля. А там когда полетим в космос или султан сдохнет
или протокол.

Но КМК Ipv6 будет не очень хорошо распределять сетки и диапазоны. Или большая часть разрядности
будет бездарно профукана в угоду бюрократизму и нежеланию думать о том как грамотно распределять.

Тема интересная (особенно для сетевиков-сисадминов) и я-бы даже поднял отдельный топик.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39288991
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМеня тоже очень сильно удивило подобное расточительство. Казалось-бы увеличь сетку с 32 бит до 64 и получай
себе избыточную разрядность для всех устройств планеты Земля. А там когда полетим в космос или султан сдохнет
или протокол.Но КМК Ipv6 будет не очень хорошо распределять сетки и диапазоны. Или большая часть разрядности
будет бездарно профукана в угоду бюрократизму и нежеланию думать о том как грамотно распределять.
Да все там продумано. 64 бита отведено на автоматическую генерацию адреса (например из физического адреса), а остальные 64 - это и есть расширение адресного пространства.
...
Рейтинг: 0 / 0
25 сообщений из 276, страница 9 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]