powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
276 сообщений из 276, показаны все 12 страниц
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280701
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
суть задачи

есть необходимость написать библиотечные inline- функции (имеется в виду статическая библиотека).

т.е. код для инлайнинга должен лежать в .lib, это важно, не в .h

вариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит).
ну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу.

в visual c++ удалось подобное запинать через __inline __forceinline и обязательный /GL с /LTCG (кроссмодульно инлайнит только на линковке, иначе никак инлайниться не пожелало).

в GСC же получился какой-то явный brainfuck с __attribute__ ((gnu_inline)), возврат к GNU89 семантике как-то показался сильно подозрительным. в Solaris Studio аналогично - свои чудные бубенцы с флагами обратной совместимости. до других компиляторов руки еще не дошли.

собственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж? пример библиотек? компиляторы - последних-предпоследних версий. усиленный гуглеж в течение суток убедительных примеров не дал.

и желательно еще и случай .dll/.so, хотя последние не обязательны (они используются только для ускорения линковки при разработке, там все равно debug режим, а релиз собирается целиком статическим блобом)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280710
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если попробовать LTO как описано здесь?
http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280718
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА если попробовать LTO как описано здесь?
http://stackoverflow.com/questions/5987020/can-the-linker-inline-functions

c GCC опциями компилятора проблем нет, там проблема в том, что inline атрибут на функцию указывается немного через одно место - в соответствии c С99/C11 стандартами, с выплевыванием куч warning и прочими малопонятными не покрытыми внятной документацией приседанями.

кучерявыми макросами и научным тыком все это конечно решается, но осадок сырости остался.


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

изучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280721
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так при LTCG/LTO помечать как inline вообще не нужно. Компайлер сам разберется.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280722
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaизучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно.
Ничего странного. Inline на современных процах особой роли не играет. Поэтому никто не заморачивается.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280723
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вот эта мотивация очень специфическая.
nojavaвариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит).
ну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280728
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskynojavaизучение же кроссплатформенных библиотек результата не дало - там эта тема не раскрыта, что довольно странно.
Ничего странного. Inline на современных процах особой роли не играет. Поэтому никто не заморачивается.

да да, ты еще скажи, что между O0 и O3 на современных процах разницы нет.

задача явного управления инлайном - это просто ограничение маневра анализатору - а то он там сам наанализирует.

Anatoly MoskovskyНу и вот эта мотивация очень специфическая.
Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных.

Такое изначально никому не нужно - мало кто отважится сделать свой "еще один Objective C"
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280748
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaсуть задачи

есть необходимость написать библиотечные inline- функции (имеется в виду статическая библиотека).
т.е. код для инлайнинга должен лежать в .lib, это важно, не в .h



inline не могут быть библиотечными.
Либо inline, либо библиотечные.
Т.е. в современном последнем стандарте inlinе функции должны быть определены в заголовочном файле.
Примут модули -- будет по-другому, но в любом случае не в .lib они будут лежать (видимо)

nojava
вариант делать как обычно - дефиницию помещать в .h не подходит, т.к. функции тянут за собой довольно тяжелые внешние зависимости, которые в целевом проекте не нужны (чтоб не портить ctags/intellisense и прочий автокомплит).



Это не связанные вещи.



nojavaну и не разрешать девелоперу просто так юзать третьесторонние фичи без спросу.


Как бы если ты хочешь использовать inline-функции, это неизбежно.

nojavaсобственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж? пример библиотек?


Никак. это невозможно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280775
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaда да, ты еще скажи, что между O0 и O3 на современных процах разницы нет.
В вашем случае нет разницы.
Когда функция является оберткой над скрытой имплементацией, то инлайнь ее или нет - пофиг.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280779
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaAnatoly MoskovskyНу и вот эта мотивация очень специфическая.
Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных.

Шутник, синтаксис у С++ тоже не совсем адекватен для прикладного проганья
а нативный движок + скрипты для прикладников чем не устраивает?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут - целый топик про преждевременную оптимизацию.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280876
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivinline не могут быть библиотечными.
Либо inline, либо библиотечные.


MasterZivНикак. это невозможно.

твое мнение очень ценно для нас (с)

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

вообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения.
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins
и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx
плюс атомарные builtin , плюс чекалки доступа памяти, плюс...

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


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

Вот тут да, ты прав, там мотивация - сделать из C/C++ среду прикладного, а не системного программирования. Стандартные библиотеки и остальное на прикладные задачи совсем не тянут - попросту неадекватны, потому и должны быть гарантированно выкинуты из доступных.

Шутник, синтаксис у С++ тоже не совсем адекватен для прикладного проганья
а нативный движок + скрипты для прикладников чем не устраивает?
синтаксис у С++ вполне адекватен, я не говорил обратного.

неадекватны стандартные библиотеки, они не заточены под программирование к примеру тех-же бухгалтерских или веб задач, дебет кредит, база данных-HTML рендеринг.

если в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь.

в теории GCC поддерживает decimal float, но по факту - нет. и это мы только по типам данных для денег прошлись, дальше можно и по остальным неадекватностям прогуляться - от ORM, то веб-темплейтов, будет, мягко говоря, не весело, но мне уже немного лень
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280918
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaсобственно вопрос - у кого-то есть пример как надо правильно и кроссплатформенно делать сабж?Кроссплатформенно - никак. Это надо, чтобы компилятор генерировал не готовый машинный код, в который линкер только подставляет адреса внешних функций, а некое промежуточное представление. Что далеко не всегда имеет место быть.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280930
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava,

я крайне сомневаюсь, что у вас получится одновременно extern и inline. Более того, я уверен, что у вас так не получится, чтобы это ещё и реально работало, допустим, под gcc, clang и MS C++ compiler ... а ведь можно ещё про интел вспомнить и Сан Оракл ...

Но если вдруг получится - поделИтесь секретом, ладно?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39280962
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nojavaесли в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь.
std::ratio<1, 100> - чем он хуже, чем в Oracle есть свой BCD подобный тип NUMBER?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281014
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткинnojavaесли в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь.
std::ratio<1, 100> - чем он хуже, чем в Oracle есть свой BCD подобный тип NUMBER?
Они ничем не хуже и не лучше.

Когда вы работаете в Oracle PLSQL с типом NUMBER то вы воспроизводите
NULL-семантику реляционной алгебры. Тоесть при расчете avg(..) от трех
строк в таблице {0,null,6} вы не должны заменять null на 0 а учитывать
его как несуществующее значение в коллекции. Тоесть среднее должно
быть равно 3 а не 2.

Также у вас не должно быть попытки расширять тип NUMBER больше 40
десятичных разрядов на клиенте. Тоесть не должно быть в принципе такой
возможности. При сериализации-десериализации не должно быть потерь
или внезапных приобретений в значениях числа.

Также надо посмотреть в сторону погрешностей расчетов. Нужно 100%
эмулировать BCD-арифметику иначе расчеты клиента и сервера
где-то не сойдутся. Кому-то последний пункт может показаться не очень
важным но это еще один способ стрельнуть себе в ногу в неожиданном месте.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281024
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaвообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения.
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins
и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx
плюс атомарные builtin , плюс чекалки доступа памяти, плюс...

которые в каждой платформе свои особо кустистые, и делать их обычными функциями - это просад по перфомансу до 50%
Да вы просто неправильно язык выбрали, вам не С++ нужен, а то-то другое :)
А вообще проверка переполнения дает просадку производительности, даже если она интегрирована в языке.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281080
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaа так да - мнение, инлайнить или нет - очень ценное мнение, выскажешь его еще раз?
Если надо инлайнить - пишите инлайн функции в хедерах и поставляйте их с библиотекой.
Это ответ на ваш вопрос как грамотно делать.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281098
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskynojavaа так да - мнение, инлайнить или нет - очень ценное мнение, выскажешь его еще раз?
Если надо инлайнить - пишите инлайн функции в хедерах и поставляйте их с библиотекой.
Это ответ на ваш вопрос как грамотно делать.

в этом совете нет ни грамма про грамотность, там лишь про типовой общепринятый (и неадекватный в данном случае) подход.

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

каждый раз парсить эти .h при компиляции и делать подобную ненужную работу тоже не хочу (и вот не надо тут говорить еще и про pch, там отдельная смешная печаль в этих ваших фактически некросплатформенных C/C++).
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281109
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaganojava,

я крайне сомневаюсь, что у вас получится одновременно extern и inline. Более того, я уверен, что у вас так не получится, чтобы это ещё и реально работало, допустим, под gcc, clang и MS C++ compiler ... а ведь можно ещё про интел вспомнить и Сан Оракл ...

Но если вдруг получится - поделИтесь секретом, ладно?

это уже получилось, в gcc, mvcc, clang, sunpro. никакого секрета нет - везде используется link time optimization, ключи естественно разные, но cmake им вполне можно обучить.
форсирование инлайнинга везде делается по-разному, но чудные макросы INLINE решают и эту проблему.

в debug режиме (O0) это все, естественно, не работает

со временем будет опубликовано на github, пока не время :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281122
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любителям ректального подхода надо понимать что инлайн потом оптимизация != компиляция потом инлайн маш.кода

смысла мало
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281125
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojavaвообще-то не пофиг, потому что инлайнится builtin целочисленной арифметики, с проверкой переполнения.
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html#Integer-Overflow-Builtins
и аналогичные интринзики из MVCC https://msdn.microsoft.com/en-us/library/windows/desktop/ff516460(v=vs.85).aspx
плюс атомарные builtin , плюс чекалки доступа памяти, плюс...

которые в каждой платформе свои особо кустистые, и делать их обычными функциями - это просад по перфомансу до 50%
Да вы просто неправильно язык выбрали, вам не С++ нужен, а то-то другое :)
А вообще проверка переполнения дает просадку производительности, даже если она интегрирована в языке.

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

кроме того, С/C++ по факту наиболее развиты в части оптимизации кода и поддержка в IDE одна из лучших


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

этож основы контрактного программирования. если у тебя в for (int i = 0; i < n; i++) проверка на переполнение встроена уже в i < n, то ясное дело, ее нет никакой нужны делать еще и в i++.

но такое дармовое контрактное условие выполняется/проверяется не всегда, потому у разработчика должен быть выбор.

а конктерно в контексте выше - проверка на целочисленное переполнение нужна в случае как раз библиотеки для финансовой математики - если в случае double переполнение будет решено просто потерей значимых цифр (без всякого exception), то если делать fixed point number тип для подсчета денег, то переполнение значимых цифр может привести к катастрофе (опять-же, без exception) - а это надо отлавливать и проверять.

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

Неожиданное место начинается в безобидном числе 0.3, которое никак не может быть представлено через double/float
даже специальный сайт есть с описанием этого... феномена


http://0.30000000000000004.com/


кстати, даже в Delphi есть специальный тип Currency .
Кстати, реализован именно как Fixed point number, хотя BСD там тоже есть http://docwiki.embarcadero.com/RADStudio/Seattle/en/BCD_Support_Routines

Аналогичная ситуация в .NET

Хотя умудренные опытом мейнфрейм деды говорят не про BCD, а про decimal floating point , который в .NET тоже есть https://msdn.microsoft.com/en-us/library/364x0z75.aspx и примерно подобный в Java http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

надо понимать, что BCD != DFP != Fixed point, это разные подходы к точному подсчету денег. А в Oracle NUMBER - это вообще base-100 тип.

самый скоростной и переносимый - fixed point, ибо крутится на integer (int64/int128)


а avg() это отдельная тема, и NULL во float/double вроде как принято представлять через NaN, нет?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281204
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaно такое дармовое контрактное условие выполняется/проверяется не всегда, потому у разработчика должен быть выбор.
Выбор == возможность облажаться
А так еще забавный момент - в С++ переполнение для signed - это неопределенное поведение (в отличие от unsigned). Причем эти грабли совершенно реальны . Так что даже проверить наличие знакового переполнения кроссплатформенно затруднительно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281213
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaговоря проще - никто не собирается включать проверку целочисленного переполнения глобально, это глупо, да и в случае фунций хеширования и чексумм - еще и недопустимо, там алгоритмы на переполнении как раз и построены.
Если очень надо - можно вставками на асме писать вычисления и проверять флаг переполнения.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281216
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли очень надо - можно вставками на асме писать вычисления и проверять флаг переполнения.
далеко не везде их можно писать, не говоря уже об осмысленности
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281217
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojavaно такое дармовое контрактное условие выполняется/проверяется не всегда, потому у разработчика должен быть выбор.
Выбор == возможность облажаться
А так еще забавный момент - в С++ переполнение для signed - это неопределенное поведение (в отличие от unsigned). Причем эти грабли совершенно реальны . Так что даже проверить наличие знакового переполнения кроссплатформенно затруднительно.

затруднительно, но не невозможно - см. выше про intsafe.h и gcc builtin-ы

возможность облажаться есть всегда - даже в Java с их хваленым "GC решает все проблемы" память точно так-же течет, как и везде, ну а вместо dangling pointer они отхватили свои классы системных проблем

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

так-то в лужу можно сесть всегда вон на простейшем: http://blog.regehr.org/archives/1307, где даже -Wstrict-aliasing не помогает :(
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281243
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaзатруднительно, но не невозможно - см. выше про intsafe.h и gcc builtin-ы
В ссылке про intsafe.h - только про unsigned, по крайней мере я не увидел там signed типов... Про gcc - да, там есть
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281258
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaэто уже получилось, в gcc, mvcc, clang, sunpro. никакого секрета нет - везде используется link time optimization, ключи естественно разные, но cmake им вполне можно обучить.
форсирование инлайнинга везде делается по-разному, но чудные макросы INLINE решают и эту проблему.

в debug режиме (O0) это все, естественно, не работает
А вы уверены, что ваши __inline__ в исходнике как-то попадают объектный файл и влияют на решение линкера? Может, просто поставив ключи для link time optimization, вы получите то же самое?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281266
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaа avg() это отдельная тема, и NULL во float/double вроде как принято представлять через NaN, нет?
Нет. Арифметика с Infinity/Nan - это все части стандарта IEE 754 и других (тысячи их). Я знаю что
JavaScript весьма лукавым образов вводит полиморфизм decimal-типов используя double но
и имеет артефакты. Точно не уверен (не специалист в JS) но кажется только индексы массивов
кастятся в целое а все остальные вычисления арифметики идут через double.

Реляционная алгебра - это другое. Выше кто-то предложил юзать std::ratio<1, 100> в качестве замены
NUMBER(m,n) на клиентской стороне. Я говорю - ОК я не против. Только давайте договримся как будем
представлять NULL и как с ним работать. Тривиально если мы получили SELECT NULL FROM DUAL; у нас должна быть
техническая возможность положить это значение в тип и работать с ним далее с сохранением семантики
Oracle - вычислений. Тоесть нам нужна биекция между доменом значений NUMBER и нашим типом данных
на стороне клиента.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281298
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojavaэто уже получилось, в gcc, mvcc, clang, sunpro. никакого секрета нет - везде используется link time optimization, ключи естественно разные, но cmake им вполне можно обучить.
форсирование инлайнинга везде делается по-разному, но чудные макросы INLINE решают и эту проблему.

в debug режиме (O0) это все, естественно, не работает
А вы уверены, что ваши __inline__ в исходнике как-то попадают объектный файл и влияют на решение линкера? Может, просто поставив ключи для link time optimization, вы получите то же самое?

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

как говорится - оптимист всегда верит, что будет лучше. пессимист верит что в лучшем случае не станет хуже
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281312
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaа avg() это отдельная тема, и NULL во float/double вроде как принято представлять через NaN, нет?
Нет. Арифметика с Infinity/Nan - это все части стандарта IEE 754 и других (тысячи их). Я знаю что
JavaScript весьма лукавым образов вводит полиморфизм decimal-типов используя double но
и имеет артефакты. Точно не уверен (не специалист в JS) но кажется только индексы массивов
кастятся в целое а все остальные вычисления арифметики идут через double.


да, в JavaScript вообще все числа по-умолчанию double, там чтоб как-то подсказать JITу, что это integer - нужно делать еще те приседания.

maytonstd::ratio Тоесть нам нужна биекция между доменом значений NUMBER и нашим типом данных
на стороне клиента.

std::ratio это вообще не про это подсчет денег, это для теоретизированых математик, это вообще мимо кассы со страшным грохотом

http://en.cppreference.com/w/cpp/numeric/ratio/ratio_add
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281397
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaсо временем будет опубликовано на github, пока не время :)
Чувствую, когда придет время, Стебелек будет повержен
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281415
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavamaytonstd::ratio Тоесть нам нужна биекция между доменом значений NUMBER и нашим типом данных
на стороне клиента.

std::ratio это вообще не про это подсчет денег, это для теоретизированых математик, это вообще мимо кассы со страшным грохотом

http://en.cppreference.com/w/cpp/numeric/ratio/ratio_add
Для nested set может пригодится.
http://www.sql.ru/forum/1151532-1/tyapnichnyy-nested-set
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281449
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskynojavaсо временем будет опубликовано на github, пока не время :)
Чувствую, когда придет время, Стебелек будет повержен

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


std::ratio это вообще не про это подсчет денег, это для теоретизированых математик, это вообще мимо кассы со страшным грохотом

http://en.cppreference.com/w/cpp/numeric/ratio/ratio_add
Для nested set может пригодится.
http://www.sql.ru/forum/1151532-1/tyapnichnyy-nested-set

листая подобное, понимаешь - насколько они далеки от народа (с)

а всего-то навсего хотелось вариацию на тему Pro*C
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281567
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava
если в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь.



как раз в финансовых задачах float очень даже можно использовать, в бухгалтерских нельзя.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281738
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivnojavaесли в Oracle есть свой BCD подобный тип NUMBER, то в C++ есть только IEEE float с потерей точности, за использование которого в финансовых задачах нужно просто брать руки и зажимать их нежно в дверь.



как раз в финансовых задачах float очень даже можно использовать, в бухгалтерских нельзя.

пример, название финансовой задачи, в которой допустимы искажения данных на округлении, приведешь?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281759
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно MasterZiv имеет в виду аналитику и принятие решений?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281900
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaсо временем будет опубликовано на github, пока не время :)
А я-то губу раскатал :) Три года ждать? :))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281904
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaganojavaсо временем будет опубликовано на github, пока не время :)
А я-то губу раскатал :) Три года ждать? :))
к 2020 вроде обещвно
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проект Стебелек автор не развивает. Он щас переключился на JSON-подобную dbms.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39281976
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилBagaBagaпропущено...

А я-то губу раскатал :) Три года ждать? :))
к 2020 вроде обещвно

а я что, виноват? в этом вашем C/C++ все блин как-то сделано через одно место (в сравнении с той-же Delphi или Java).

Хочется допустим в релиз тиснуть развертывание стрека (stacktrace функция, файл, номер строки) при exception, как это сделано в Java, и понеслась - stackwalker.cpp, backtrace() и прочие чудные костыли, 100500 опций компилятора, которые хрен пойми как тискать в эти ваши cmake конфиги, просто чтоб получить striped debug info (не показывать кастомеру излишнее).

Причем каждая платформа имеет свои, особо зверские костыли в вопросе, тот-же Mac OS X 10.9 и выше вообще backtrace() разучился понимать, OpenBSD его никогда и не понимал, а в Solaris как всегда свои косяки с addr2line, и... а всем до лампочки.
Скажано - stacktrace не нужен, сиди втыкай в coredump, ага (который у клиента не включен, ясен пончик).


Вон заставить заработать инлайнинг - тоже нужно блин целое исследование три дня делать, изучать всякую ерунду вроде golden блин linker для clang с плагинами и прочие приседания сделать. ABI несовместимости для .so - следующий квест, и т.д.

cmake библиотека уже перевалила вторую тысячу строк. на automake даже смотреть не хочется, не смешно ни разу (под виндой и солярой его никогда не будет).

Понаделают же недо решений. Каждый казалось бы простой вопрос - как привинтить ту или иную фичу кроссплатформенно - и нужно брать мачете и проламывать такие дебри, что иногда хочется взять и плюнуть, и перейти на Visual Basic.

Уже давно бы перешел, только он не кроссплатформенный :(

Как вы вообще умудряетесь работать с такой чудной средой - прямо загадка.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282130
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava, не переживай браток. Просто С++ это не твоё.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282148
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaКаждый казалось бы простой вопрос - как привинтить ту или иную фичу кроссплатформенно
Нужда в кроссплатформенности сильно преувеличена.
Больше всего стоит разработка и поддержка софта.
А платформу можно подогнать под софт какую надо. Стоит это копейки по сравнению.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282191
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskynojavaКаждый казалось бы простой вопрос - как привинтить ту или иную фичу кроссплатформенно
Нужда в кроссплатформенности сильно преувеличена.
Больше всего стоит разработка и поддержка софта.
А платформу можно подогнать под софт какую надо. Стоит это копейки по сравнению.

сильно, не сильно - это до лампочки. есть понятие sanity check - если ты что-то можешь сделать только в MSVC или в GCC, то сто пудов ты это делаешь не так.

типичный пример - макросы TODO, которые через pragma message бросают сообщение при билде, которые потом засасывает jenkins и т.п.

попробуй сделать это так, чтоб понимало


Код: plaintext
1.
2.
3.
4.
TODO(let's do something here, and there)

int main(void) {
}



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

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

конечно С++ это не мое, программировать на возведенной в абсолют копипасте (это я про темплейты), это пожалуйста пройдите к другому эскулапу.

С != С++
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282244
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaMasterZivпропущено...


как раз в финансовых задачах float очень даже можно использовать, в бухгалтерских нельзя.

пример, название финансовой задачи, в которой допустимы искажения данных на округлении, приведешь?

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

Нет, просто бюджетирование. Там не надо до копеек чтобы всё сходилось.
Вообще. И даже вредно этого добиваться.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282251
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочется допустим в релиз тиснуть развертывание стрека (stacktrace функция, файл, номер строки) при exception, как это сделано в Java, и понеслась - stackwalker.cpp, backtrace() и прочие чудные костыли, 100500 опций компилятора, которые хрен пойми как тискать в эти ваши cmake конфиги, просто чтоб получить striped debug info (не показывать кастомеру излишнее).

Это platform specific.

Вон заставить заработать инлайнинг - тоже нужно блин целое исследование три дня делать, изучать всякую ерунду вроде golden блин linker для clang с плагинами и прочие приседания сделать. ABI несовместимости для .so - следующий квест, и т.д.


inline где надо современные компиляторы очень хорошо делают. Видимо, ты хочешь его добиться там, где не надо...


cmake библиотека уже перевалила вторую тысячу строк. на automake даже смотреть не хочется, не смешно ни разу (под виндой и солярой его никогда не будет).

Про солярий не скажу, точно не знаю, но под виндой automake есть даже в двух экземплярах.
Другое дело, что это -- вообще в корне неверный подход, тупиковая ветвь развития. Правильная -- CMake.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282253
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskynojavaКаждый казалось бы простой вопрос - как привинтить ту или иную фичу кроссплатформенно
Нужда в кроссплатформенности сильно преувеличена.
Больше всего стоит разработка и поддержка софта.
А платформу можно подогнать под софт какую надо. Стоит это копейки по сравнению.

Очень правильные слова.
На самом деле каждой платформе -- своё назначение. Win -- для UI, (мас туда же), решается QT, и даже линукс захватывает,
а вычисления и обработка данных -- Linux, они же WEB-сервера и другие enterprise-приложения.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282266
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivnojavaпропущено...


пример, название финансовой задачи, в которой допустимы искажения данных на округлении, приведешь?

Например, планирование бюджета предприятия на год...
эта задача в 99.99% случаев делается в инструменте под названием Excel.

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

о чем твой спич? под виндой и cygwin есть, и что с того? никто не собирает проекты для студии через automake, я и говорил про это выше.

cmake тоже не панацея, в изначальном виде это так, для детского сада по уровню настроек. он не умеет даже striped pdb в relwithdebuginfo делать, о чем там вообще можно говорить.

хотя cmake хоть допилить можно, да. угу. каждый девелопер сидит и пилит небось :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282286
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaMasterZivпропущено...


Например, планирование бюджета предприятия на год...
эта задача в 99.99% случаев делается в инструменте под названием Excel.

но ты продолжай, продолжай, откровения-то.

А что, если ты попадаешь на тот самый 0.01% ?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282331
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nojavamaytonпропущено...

Нет. Арифметика с Infinity/Nan - это все части стандарта IEE 754 и других (тысячи их). Я знаю что
JavaScript весьма лукавым образов вводит полиморфизм decimal-типов используя double но
и имеет артефакты. Точно не уверен (не специалист в JS) но кажется только индексы массивов
кастятся в целое а все остальные вычисления арифметики идут через double.


да, в JavaScript вообще все числа по-умолчанию double, там чтоб как-то подсказать JITу, что это integer - нужно делать еще те приседания.

maytonstd::ratio Тоесть нам нужна биекция между доменом значений NUMBER и нашим типом данных
на стороне клиента.

std::ratio это вообще не про это подсчет денег, это для теоретизированых математик, это вообще мимо кассы со страшным грохотом

http://en.cppreference.com/w/cpp/numeric/ratio/ratio_add

Время через std::ratio<> в стандартной библиотеке считают , так чего бы и деньги не считать?

Чето типа таких плясок: http://ideone.com/fCbQEi

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
#include <iostream>
#include <chrono>
#include <ratio>
#include <vector>
#include <numeric>

template <class Rep, class Period = std::ratio<1> >
using tmp_t = std::chrono::duration<Rep, Period>;

typedef tmp_t<int64_t> dollar_t;
typedef tmp_t<int64_t, std::ratio<1,100>> cent_t;

typedef tmp_t<int64_t, std::ratio<1,100>> store_money_t;
typedef tmp_t<double> show_money_t;
dollar_t dollar_lost_cents_cast(cent_t cents) { return std::chrono::duration_cast<dollar_t>(cents); }
std::ostream& operator<<(std::ostream& os, show_money_t show_money) { os << "$" << show_money.count(); return os; }
std::ostream& operator<<(std::ostream& os, store_money_t store_money) { os << store_money.count(); return os; }

int main() {

	// example
	store_money_t store_money = dollar_t(2) + cent_t(20);
	store_money += dollar_t(7);
	store_money += cent_t(18);
	
	cent_t cents = store_money;
	dollar_t dollars = dollar_lost_cents_cast(cents);
	show_money_t show_money = cents;
	
	std::cout << "dollar_lost_cents_cast = " << dollar_lost_cents_cast(store_money).count() << 
		", store_money = " << store_money << 		
		", show_money = " << show_money << 
		std::endl;

	std::vector<store_money_t> user_accounts(1000, store_money);
	store_money_t total = std::accumulate (user_accounts.begin(), user_accounts.end(), store_money_t(0));
	std::cout << "total = " << show_money_t(total);

	return 0;
}
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282336
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинВремя через std::ratio<> в стандартной библиотеке считают , так чего бы и деньги не считать?
Это шаблоны. Настоящим профи такое нельзя )))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282339
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonВася Уткинпропущено...

std::ratio<1, 100> - чем он хуже, чем в Oracle есть свой BCD подобный тип NUMBER?
Они ничем не хуже и не лучше.

Когда вы работаете в Oracle PLSQL с типом NUMBER то вы воспроизводите
NULL-семантику реляционной алгебры. Тоесть при расчете avg(..) от трех
строк в таблице {0,null,6} вы не должны заменять null на 0 а учитывать
его как несуществующее значение в коллекции. Тоесть среднее должно
быть равно 3 а не 2.

Также у вас не должно быть попытки расширять тип NUMBER больше 40
десятичных разрядов на клиенте. Тоесть не должно быть в принципе такой
возможности. При сериализации-десериализации не должно быть потерь
или внезапных приобретений в значениях числа.

Также надо посмотреть в сторону погрешностей расчетов. Нужно 100%
эмулировать BCD-арифметику иначе расчеты клиента и сервера
где-то не сойдутся. Кому-то последний пункт может показаться не очень
важным но это еще один способ стрельнуть себе в ногу в неожиданном месте.

Да и кстати, такие пляски для null можно: http://ideone.com/Dr2INK

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
#include <iostream>
#include <chrono>
#include <ratio>
#include <vector>
#include <numeric>
#include <algorithm>

template <class Rep, class Period = std::ratio<1> >
using tmp_t = std::chrono::duration<Rep, Period>;

typedef tmp_t<int64_t> dollar_t;
typedef tmp_t<int64_t, std::ratio<1,100>> cent_t;

//typedef tmp_t<int64_t, std::ratio<1,100>> store_money_t;
struct store_money_t : cent_t { 
	store_money_t(cent_t::rep v = 0, bool null = false) : cent_t(v), is_null(null) {} 
	store_money_t(cent_t c) : cent_t(c) {} 
	store_money_t(dollar_t d) : cent_t(d) {} 
	bool is_null = false;
};

dollar_t dollar_lost_cents_cast(cent_t cents) { return std::chrono::duration_cast<dollar_t>(cents); }
std::ostream& operator<<(std::ostream& os, store_money_t store_money) { 
	os << store_money.count()/100 << "." << store_money.count()%100; 
	return os; 
}

store_money_t null_money(0, true);
bool not_null_money(store_money_t &m) { return !m.is_null; }

int main() {

	// example
	store_money_t store_money = dollar_t(2) + cent_t(20);
	store_money += dollar_t(7);
	store_money += cent_t(18);
	
	cent_t cents = store_money;
	dollar_t dollars = dollar_lost_cents_cast(cents);
	
	std::cout << "dollar_lost_cents_cast = " << dollar_lost_cents_cast(store_money).count() << 
		", store_money = " << store_money << std::endl;

	// INSERT INTO Table ( Column1 ) VALUES ( 0), ( null ), ( 6 )
	// SELECT AVG( Column1 ) FROM Table
	std::vector<store_money_t> user_accounts = { cent_t(0), null_money, dollar_t(6) };

	store_money_t sum = std::accumulate (user_accounts.begin(), user_accounts.end(), store_money_t());
	std::cout << "sum = " << sum << std::endl;
	
	store_money_t::rep count = std::count_if(user_accounts.begin(), user_accounts.end(), not_null_money);
	std::cout << "count = " << count << std::endl;
	
	store_money_t avg = sum / count;
	std::cout << "avg = " << avg << std::endl;
	
	// SELECT 0 + null + 6 FROM dual
	store_money_t sum_select_statment = cent_t(0) + null_money + dollar_t(6);
	std::cout << "sum_select_statment = " << sum_select_statment << std::endl;
	
	return 0;
}



авторsum = 6.0
count = 2
avg = 3.0
sum_select_statment = 6.0
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282342
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyВася УткинВремя через std::ratio<> в стандартной библиотеке считают , так чего бы и деньги не считать?
Это шаблоны. Настоящим профи такое нельзя )))
Да там вообще человек запутался, темплейты называет копипастой, когда темплейты - это избавление от копипасты.
Шаблоны слишком коротко - за количество строк мало заплатят
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282418
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно платят за бизнес-фичи. Но у вас как-то странно.... количество строк....

Писать надо ровно столько строк чтобы самому было понятно
и иметь возможность прошагать отладчиком.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282476
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОбычно платят за бизнес-фичи.по разному бывает, иначе откуда бы взялся индусский код? ))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282561
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivnojavaпропущено...

эта задача в 99.99% случаев делается в инструменте под названием Excel.

но ты продолжай, продолжай, откровения-то.

А что, если ты попадаешь на тот самый 0.01% ?

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

Это шаблоны. Настоящим профи такое нельзя )))
Да там вообще человек запутался, темплейты называет копипастой, когда темплейты - это избавление от копипасты.
Шаблоны слишком коротко - за количество строк мало заплатят

темплейты - это возведенная в абсолют автоматизированная копипаста, так убедительнее звучит?
не важно кто копипасту ипсолняет - кодер Вася или компилятор, копипастой от этого она не перестает быть.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282572
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинДа и кстати, такие пляски для null можно: http://ideone.com/Dr2INK


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

вообще конечно идея, что для простейших арифместических операций нужен какой-то C++ брейнфак с темплейтами, вместо простешего кода ниже

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main() {
  qty_t amount = 20.32, 
  price_t price = 100.321, 
  money_t sum;

  sum = price * amount; // 2038.50 в итоге, half up round to 2 magic
}



ужасно доставляет. мир кажется сошел с ума и совсем разучился программировать просто и эффективно.
больше букв в коде, больше! и < > закорючек, которые означают что-то иное, чем больше и меньше, это чтоб читать было проще, ага
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я если честно не понял зачем Вася написал этот пример временем.
Проверить какое-то утверждение? Возможность?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282675
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nojavaВася УткинДа и кстати, такие пляски для null можно: http://ideone.com/Dr2INK


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

вообще конечно идея, что для простейших арифместических операций нужен какой-то C++ брейнфак с темплейтами, вместо простешего кода ниже

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main() {
  qty_t amount = 20.32, 
  price_t price = 100.321, 
  money_t sum;

  sum = price * amount; // 2038.50 в итоге, half up round to 2 magic
}



ужасно доставляет. мир кажется сошел с ума и совсем разучился программировать просто и эффективно.
больше букв в коде, больше! и < > закорючек, которые означают что-то иное, чем больше и меньше, это чтоб читать было проще, ага
Т.е. вопрос не в том, что это нельзя сделать в С++, а в том, что типы с таким поведением не введены в стандартную библиотеку С++ и у вас не получается их быстро сделать?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282682
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинТ.е. вопрос не в том, что это нельзя сделать в С++, а в том, что типы с таким поведением не введены в стандартную библиотеку С++ и у вас не получается их быстро сделать?
знаешь, в булочную можно и через северный полюс ездить. ну и что что долго, но технически это же возможно, верно?

в типовом современном зашаблонированном C++ (не берем упрощенку вроде C with objects) между "это в принципе возможно" и "это возможно настолько хорошо и удобно, что это даже можно использовать практически" - зачастую просто пропасть, и твой пример - подтверждение
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282694
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaвообще конечно идея, что для простейших арифместических операций нужен какой-то C++ брейнфак с темплейтами, вместо простешего кода ниже

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main() {
  qty_t amount = 20.32, 
  price_t price = 100.321, 
  money_t sum;

  sum = price * amount; // 2038.50 в итоге, half up round to 2 magic
}



ужасно доставляет. мир кажется сошел с ума и совсем разучился программировать просто и эффективно.
больше букв в коде, больше! и < > закорючек, которые означают что-то иное, чем больше и меньше, это чтоб читать было проще, агаВас расстраивает, что в стандарте С++ нет ваших qty_t, price_t, money_t? Так ведь у всех требования разные. Кто-то уверен, что его программе никогда не придется оперировать с суммами больше квинтиллиона долларов, и его устраивает тот самый где-то упомянутый тип Currency с внутренним представлением в int64, фиксированной точкой и игнорированием переполнения. Кому-то мало 4 знаков после точки. Кто-то не уверен, что квинтиллиона ему хватит, и хочет кидать исключения при переполнении. А кто-то уверен, что квинтиллиона не хватит, и использует BigNumber :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в посте увидел другое. Постулируется подход что когда у тебя нет финансового типа - ты берешь
эдакий себе конструктор LEGO и собираешь из шаблончиков нужный тип.

Ответственность за правильность решения при этом не обсуждается и предполагается что кодер
сам знает что он делает. Вопросы оптимизации этого типа (как он внутри будет считать) мы как-то сразу
скипаем. Мы также игнорируем возможные ошибки которые существуют на стыке технологий. Тоесть
ошибка в рантайме происходит не в вашем коде а где-то в недрах шаблонизировнного кода.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282719
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojavaвообще конечно идея, что для простейших арифместических операций нужен какой-то C++ брейнфак с темплейтами, вместо простешего кода ниже

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main() {
  qty_t amount = 20.32, 
  price_t price = 100.321, 
  money_t sum;

  sum = price * amount; // 2038.50 в итоге, half up round to 2 magic
}



ужасно доставляет. мир кажется сошел с ума и совсем разучился программировать просто и эффективно.
больше букв в коде, больше! и < > закорючек, которые означают что-то иное, чем больше и меньше, это чтоб читать было проще, агаВас расстраивает, что в стандарте С++ нет ваших qty_t, price_t, money_t? Так ведь у всех требования разные. Кто-то уверен, что его программе никогда не придется оперировать с суммами больше квинтиллиона долларов, и его устраивает тот самый где-то упомянутый тип Currency с внутренним представлением в int64, фиксированной точкой и игнорированием переполнения. Кому-то мало 4 знаков после точки. Кто-то не уверен, что квинтиллиона ему хватит, и хочет кидать исключения при переполнении. А кто-то уверен, что квинтиллиона не хватит, и использует BigNumber :)

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

а так - для определенного класса задач (скажем так, 99.9% случаев) существуют вполне себе разумные и общепринятые правила.
к примеру уже не осталось стран, которые используют что-то, кроме 1/100 для денег, а суммарный ВВП за всю историю человечества
тоже вполне расчитываемая и конечная величина, квинтиллионы там не нужны.

т.е. для подчета денег вполне достаточно fixed number, производного от int, с точностью два знака.

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

Код: plaintext
1.
2.
      73,994,000,000,000.00
92,233,720,368,547,758.07 // max int



в этом и отличается прагматический инженерный подход и "стандартная обобщенная хрень".

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

а ученые от теорматематки вообще идут отдельным лесом, давайте их чудные комплексные числа бухгалтерам тиснем, для начала?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282767
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двух знаков недостаточно :) Вон на всех биржах цены с 4 знаками.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282769
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava
Код: plaintext
1.
2.
      73,994,000,000,000.00
92,233,720,368,547,758.07 // max int


Замечательное кстати число https://lenta.ru/news/2013/07/17/paypal/
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не думаю что ВВП возможно посчитать до копейки. Тут скорее важно оценить. И принять решение.

А вот в налоговых вопросах - там да.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282775
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojava
Код: plaintext
1.
2.
      73,994,000,000,000.00
92,233,720,368,547,758.07 // max int


Замечательное кстати число https://lenta.ru/news/2013/07/17/paypal/

это они просто -1 в unsigned видать закастили и не сделали проверки на переполнение.
после этого случая, уверен, доработали проверки.

а так да - пример того, что PayPal испольузует fixed number от int64 - лишний раз доказывает, как нужно правильно нужно считать деньги. и как не надо делать - не делать проверки переполнения и кастования.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282785
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneДвух знаков недостаточно :) Вон на всех биржах цены с 4 знаками.

а вообще-то суммы (деньги) и цены - это разные типы.

money_t - это всегда два знака
price_t - это как минимум 6 знаков

с количествами отдельная печаль (там знаков может быть до 9)

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

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

ему нужно конкретно сказать - вот тут money_t, тут price_t, а тут qty_t, и не вздумай попутать или заюзать double - расстрел на месте.

заставить его думать, что там ему тиснуть в параметры std шаблона - это вообще космической наивности и глупости предположения.
нет там таких интеллектуалов среди прикладников, чтоб они изначально разбирались в предметах и требованиях точности расчетов.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282809
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaк примеру мировой ВВП в прошлом году это всего 73 триллиона. 92233 позволит этот ВВП суммировать 1263 раз. этого более чем достаточно для всех практических бухгалтерских и финансовых задач - ну не может быть в задаче больше денег, чем человечество способно в принципе произвести. так это еще с точностью до копейки, а если без копейки - это 126300 раз - больше, чем в обозримой перспективе человечество вообще сможет денег запродуцировать Это смотря в какой валюте Нет универсального подходящего для всех решения.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282828
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для денег double достаточно. Чтобы погрешность в 16м десятичном знаке исказила результат - надо постараться. Для расчетов это не критично.
Другое дело что их нельзя сравнивать, и при сортировке проблемы.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282832
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaтемплейты - это возведенная в абсолют автоматизированная копипаста, так убедительнее звучит?
не важно кто копипасту ипсолняет - кодер Вася или компилятор, копипастой от этого она не перестает быть.
Не больший копипаст чем инлайн
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282899
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskynojavaтемплейты - это возведенная в абсолют автоматизированная копипаста, так убедительнее звучит?
не важно кто копипасту ипсолняет - кодер Вася или компилятор, копипастой от этого она не перестает быть.
Не больший копипаст чем инлайн

ты опять решил сесть в лужу? говорили же, для чего нужен инлайнинг - для вкомпиляции некроссплатформенных intrinsic и built-in, без создания абсолютно ненужных stack frame.
и даже если в чистом виде - inline он виден лишь желающим почитать ассемблерный код.

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


при этом даже гуру C++ прямо говорят - идея, что давайте все раскопипастим, а компилятор все это чудесно заоптимизирвет - оказалась пшиком, никакого прироста производительности никто так и не смог достичь, зато исполнимый код бухнет, вымывая L2/L3 кеши просто на ура.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39282917
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonenojavaк примеру мировой ВВП в прошлом году это всего 73 триллиона. 92233 позволит этот ВВП суммировать 1263 раз. этого более чем достаточно для всех практических бухгалтерских и финансовых задач - ну не может быть в задаче больше денег, чем человечество способно в принципе произвести. так это еще с точностью до копейки, а если без копейки - это 126300 раз - больше, чем в обозримой перспективе человечество вообще сможет денег запродуцировать Это смотря в какой валюте Нет универсального подходящего для всех решения.

да, про случаи гиперинфляции я тоже думал.

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

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

хотя да, пример Зимбабве и к ним приравненных говорит о том, что fixed number не годится для универсального money_t, туда только decimal number (но опять-же, появляется проблема с бинарной сортировкой).

или запилить zimbabve_t, с отрицательной точностью :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283115
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaчто это за закорючка - сравнение или все-таки чего-то там инстациирование
Первый раз вижу чтобы с этим у кого-то были трудности ))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283141
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaMasterZivПро солярий не скажу, точно не знаю, но под виндой automake есть даже в двух экземплярах.
Другое дело, что это -- вообще в корне неверный подход, тупиковая ветвь развития. Правильная -- CMake.

о чем твой спич? под виндой и cygwin есть, и что с того? никто не собирает проекты для студии через automake, я и говорил про это выше.

cmake тоже не панацея, в изначальном виде это так, для детского сада по уровню настроек. он не умеет даже striped pdb в relwithdebuginfo делать, о чем там вообще можно говорить.

хотя cmake хоть допилить можно, да. угу. каждый девелопер сидит и пилит небось :)

Да, видать, ты большой знаток, может подскажешь, что же надо ВМЕСТО CMake-то ?
А то я и не знаю...
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283142
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля денег double достаточно. Чтобы погрешность в 16м десятичном знаке исказила результат - надо постараться. Для расчетов это не критично.
Другое дело что их нельзя сравнивать, и при сортировке проблемы.
Тут сложность в чем... в преобразованиях double=> String => double. Они не биективные.
И если ты даешь возможность разработчику использовать double как хранилище для
денежных типов - то у него неизбежно появляется соблазн использовать их на всем
спектре операций. А от этого сложно застраховаться. И если на целых числах double
ведет себя вполне прилично то на дробных у нас появляется слабо контролируемая
возможность "пальнуть" себе в ногу. Я видел если не приложения то SOAP-сервисы
которые возвращали финансовые величины через double. Возможно это и не так плохо.
А вот реально плохо когда идёт распространение этого типа на всё приложение.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283143
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaо чем твой спич? под виндой и cygwin есть, и что с того? никто не собирает проекты для студии через automake, я и говорил про это выше.


Ну, понятно, что никто, но тебе же он был зачем-то нужен...
Мне лично automake и под линухом, где он вообще царь и бог, на фиг не сдался.
Это путь в никуда.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283144
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaMasterZivпропущено...


А что, если ты попадаешь на тот самый 0.01% ?

0.01% людей ложку в ухо обычно несут, вместо рта, тоже мне достижение

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

в типовом современном зашаблонированном C++ (не берем упрощенку вроде C with objects) между "это в принципе возможно" и "это возможно настолько хорошо и удобно, что это даже можно использовать практически" - зачастую просто пропасть, и твой пример - подтверждение

есть gmp, и есть её С++ врапер, если тебе надо...
boost.multiprecition...
Есть и мнго других подобных библиотек, выбирай на вкус...
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283147
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaBarloneДвух знаков недостаточно :) Вон на всех биржах цены с 4 знаками.

а вообще-то суммы (деньги) и цены - это разные типы.

money_t - это всегда два знака
price_t - это как минимум 6 знаков

с количествами отдельная печаль (там знаков может быть до 9)

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

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

ему нужно конкретно сказать - вот тут money_t, тут price_t, а тут qty_t, и не вздумай попутать или заюзать double - расстрел на месте.

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


nojava, у меня к тебе только один вопрос: тебе таксовать надо, или нет ?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283155
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TДля денег double достаточно. Чтобы погрешность в 16м десятичном знаке исказила результат - надо постараться. Для расчетов это не критично.
Другое дело что их нельзя сравнивать, и при сортировке проблемы.
Тут сложность в чем... в преобразованиях double=> String => double. Они не биективные.
И если ты даешь возможность разработчику использовать double как хранилище для
денежных типов - то у него неизбежно появляется соблазн использовать их на всем
спектре операций. А от этого сложно застраховаться. И если на целых числах double
ведет себя вполне прилично то на дробных у нас появляется слабо контролируемая
возможность "пальнуть" себе в ногу. Я видел если не приложения то SOAP-сервисы
которые возвращали финансовые величины через double. Возможно это и не так плохо.
А вот реально плохо когда идёт распространение этого типа на всё приложение.
я до сих пор на фоксе пишу в основном, а там все числовые переменные double, судя по хэлпу (ограничения совпадают), там нет явных типов, я не могу написать int x, я пишу x = 1 (но это не int а double). ХЗ как там подточено, но select ... order by nPrice, cOther отрабатывает корректно. if x = y тоже корректно, хотя double нельзя сравнивать. Как-то допилили.

ИМХУ надо аппаратно, т.е. в асме, в железе, добавить округление double до заданного разряда после запятой (в идеале десятичного, но и двоичного хватит) и тогда проблема порешается, т.к. куча софт-велосипедов не устоит перед хард-велосипедом, а интел молчит и делает вид что проблемы нет.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283160
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tя до сих пор на фоксе пишу в основном, а там все числовые переменные double, судя по хэлпу (ограничения совпадают), там нет явных типов, я не могу написать int x, я пишу x = 1 (но это не int а double). ХЗ как там подточено, но select ... order by nPrice, cOther отрабатывает корректно. if x = y тоже корректно, хотя double нельзя сравнивать. Как-то допилили.


Да нет, там десятичная арифметика реализована...

Dima TИМХУ надо аппаратно, т.е. в асме, в железе, добавить округление double до заданного разряда после запятой (в идеале десятичного, но и двоичного хватит) и тогда проблема порешается, т.к. куча софт-велосипедов не устоит перед хард-велосипедом, а интел молчит и делает вид что проблемы нет.

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

"Последний кодер на Фоксе" :)

...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283168
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа нет, там десятичная арифметика реализована...
Я про переменные писал, не про типы полей (NUMERIC в DBF десятично хранится как строка из цифр). а просто переменная имеет ограничение в точности 15 десятичных разрядов, нагуглить сходу не получилось, но поверь так и есть. 15 разрядов ничем double не напоминают?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283170
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДимыч. Ты - реликт. Тебя надо в музей сдать с табличкой
Да, реликт. Ты смысл слова реликт читал? Суть "выжил там где другие подобные не смогли", а выжил потому что рядовому юзеру глубоко фиолетово на все супермодные тенденции в программировании, ему главное чтобы работало и не тормозило. Меня убить может только отказ МС от x32 или смерть МС. Второе вероятнее, т.к. есть Win10x32
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283171
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

А та на коболе или PL/1 писал чтоб реликтом называться?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283178
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

А та на коболе или PL/1 писал чтоб реликтом называться?
а я не назывался, меня так mayton назвал, а я согласился. Дело не в "писал", а в том что писанина жива. У меня до сих пор пашет прога на FoxPro 2.6 (под DOS), 8 рабочих мест, написано мною 15 лет назад и заброшено, а народ пользуется, я поддерживаю только как админ, сглючило - починю, никаких доработок функционала.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно стопы-стопы. Никто не реликт. Я пошутил.

Это я со своим Sinclar-ом здесь - реликт.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНикто не реликт. Я пошутил.
Ну вот :( а мне так приятно было такое обращение.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283183
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivnojavaпропущено...


о чем твой спич? под виндой и cygwin есть, и что с того? никто не собирает проекты для студии через automake, я и говорил про это выше.

cmake тоже не панацея, в изначальном виде это так, для детского сада по уровню настроек. он не умеет даже striped pdb в relwithdebuginfo делать, о чем там вообще можно говорить.

хотя cmake хоть допилить можно, да. угу. каждый девелопер сидит и пилит небось :)

Да, видать, ты большой знаток, может подскажешь, что же надо ВМЕСТО CMake-то ?
А то я и не знаю...

ничего лучше cmake в настоящее время нет. как платформы.

но настройки его по-умолчанию никуда не годятся, к примеру даже гугл ничего не знает про cmake pdbstriped
что не может не удивлять - неужчто ни у кого не возникла еще идея отправлять .pdb для того, чтоб получить полноценный stacktrace?

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

но для кроссплатформы - да, ничего лучше нет.

зато сколько не качаешь проектов известных, или библиотек - везде, гыгы, поставляют .sln вайлы, что даже как-то не смешно.
говорит о многом
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283189
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivДа нет, там десятичная арифметика реализована...
Я про переменные писал, не про типы полей (NUMERIC в DBF десятично хранится как строка из цифр). а просто переменная имеет ограничение в точности 15 десятичных разрядов, нагуглить сходу не получилось, но поверь так и есть. 15 разрядов ничем double не напоминают?

Нет, не напоминают...
В double НЕТ этих разрядов.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283191
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВ double НЕТ этих разрядов.
читай вики
мантисса 52 бита, 2^52 = 4503599627370496 или ~4,5*10^15. Понял откуда 15 десятичных разрядов?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283193
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaзато сколько не качаешь проектов известных, или библиотек - везде, гыгы, поставляют .sln вайлы, что даже как-то не смешно.
говорит о многом

Это ни о чём не говорит, народ спрашивает: а где у вас .sln ? Ему и говорят: на, держи, если тебе так надо.
К тому же CMakе достаточно молод, и многие проекты его старше.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283195
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivВ double НЕТ этих разрядов.
читай вики
мантисса 52 бита, 2^52 = 4503599627370496 или ~4,5*10^15. Понял откуда 15 десятичных разрядов?
Дима имеет в виду что такое фиксируется:
Код: plaintext
1.
	double d = 999999999999999.0;



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

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

в типовом современном зашаблонированном C++ (не берем упрощенку вроде C with objects) между "это в принципе возможно" и "это возможно настолько хорошо и удобно, что это даже можно использовать практически" - зачастую просто пропасть, и твой пример - подтверждение

есть gmp, и есть её С++ врапер, если тебе надо...
boost.multiprecition...
Есть и мнго других подобных библиотек, выбирай на вкус...

абсолютно все неадекватны, потому что их еще и в базе данных нужно данные.
вот есть IEEE формат decimal128. отлично подходит. но запаливать 16 байт чтоб сохранить число вида 12.3 - это финиш.

известные базы данных, судя по исходникам (mysql, postgresql) используют тип Decimal/NUMERIC как BСD вариации, с переменной длиной. идея хорошая, но реализация так себе.

и классический мейнфреймовый packed BCD - слишком низкая плотность кодирования.

плюс BCD, и DFP типы имеют еще существенный косяк - они не поддерживаются процессорами (x64), даже сложение делается через библиотечные крайне тормозные функции.

пока мне видится лишь одно более менее идеальное решение - fixed-point number на int64 , с упаковкой в базу данных значения целого методом LEB кодирования. так получается наименьшие затраты как на хранение на диске, так и в памяти, при этом сложение, вычитание - делаются на нативной скорости процессора (ибо это суть обычные целочисленные сложения), а деление и умножение лишь немного подторможены в сравнению с int.

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

можно и int128 fixed-point сделать, но, мягко говоря, не все процессоры могут арифметику

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

суть страчена
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283214
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivВ double НЕТ этих разрядов.
читай вики
мантисса 52 бита, 2^52 = 4503599627370496 или ~4,5*10^15. Понял откуда 15 десятичных разрядов?


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

суть страчена

не совсем с мельницами.

существующие подходы и библиотеки - это разношерстное нагромождение исторических нелепостей(big-endian), заблуждений (бывают 7-ми битные компы) и простоо устаревших подходов(к примеру - не более 32 бита).

потому если и лепить ультимативную среду-платформу-библиотеку, то нужно переосмыслить существующее и накопленное, и выбрать лучшее.


а так как время и ресурсы неограничены - то даже универсальный и оптимальный тип для денег можно выбирать довольно долго


вот осознание пришло о разном формате хранения на диске(сериализации по сети в тч) и в памяти - уже мегапрогресс
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283257
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля денег double достаточно. Чтобы погрешность в 16м десятичном знаке исказила результат - надо постараться. Для расчетов это не критично.
Другое дело что их нельзя сравнивать, и при сортировке проблемы.

Дима, это утверждение примерно того же сорта осведомленности о программировании, что и
"money_t - это всегда два знака"

Проблемы у double при сортировке - простое следствие несравнимости.
Одной несравнимости достаточно - если ты не можешь надежно судить - одинаково ли количество денег в двух кошельках, то, может быть, что-то не так с твоей математикой.

Но все гораздо хуже.
Пусть есть некий double. Известна его мантисса и показатель степени.
Ближайшие значения к заданному double слева и справа определяются значениями мантиссы.
Между заданным и ближайшим (с любой стороны) никаких других представимых чисел нет.
То есть - вблизи нуля double-чисел "много", а по краям "мало" - они гораздо реже посажены,
Т.е. добавляя минимально допустимую денежную единицу (копейку) к уже накопленной сумме, ты, рано ли поздно, перестанешь сдвигаться в сумме накопления.
Такое сложение застрянет на далее неизменной накопленной сумме в тот момент, когда расстояние до ближайшего числа превысит копейку.

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

PS
Прошу прощения за вступление на чужую территорию.
Оправдываюсь тем, что существо дела здесь к CPP отношения не имеет.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283260
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc,char **argv,char **env){

	double x = 9e16; // 9e15
	double y = 1.0;
	double z = x + y;
	printf("z = %f",z);
	return 0;

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

ты это к чему?
к тому, что вам это не интересно?
Это может как-то отменить бесконечный цикл, или изменить результат добавления к миллиарду копейки ?
А так-то оно понятно - нахер они кому сдались - одинаковые чиселки в итого по дебету и кредиту.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, что за враждебность?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283282
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyПрошу прощения за вступление на чужую территорию.
Оправдываюсь тем, что существо дела здесь к CPP отношения не имеет.
Не волнуйтесь, в этом топике мало что имеет отношение к С++. Больше к цирку )))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283283
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ой. (;
(извини, я не предполагал, что ты соберешься пугаться обижаться)

всяко слово может иметь значение, не иметь, или его значение зависит от контекста.
в последовательности слов твое было по времени комментарием на мое.
смутило меня // 9e15

Дальше не враждебность, а ответ на один из контекстов, в котором оно могло появиться.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283284
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно проехали.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтам разряды двоичные. 52 двочных разряда это не то же самое, что 15 десятичных...
Давай с другой стороны: у тебя 52-хбитное беззнаковое целое. Вопрос какое максимальное число состоящее из девяток (в десятичном представлении) можно хранить? Сколько девяток максимум возможно?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283315
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main(int argc,char **argv,char **env){

	double x = 9e16; // 9e15
	double y = 1.0;
	double z = x + y;
	printf("z = %f",z);
	return 0;

}



Ну, нормальная потеря значимости.
О ней booby и говорил.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283316
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivтам разряды двоичные. 52 двочных разряда это не то же самое, что 15 десятичных...
Давай с другой стороны: у тебя 52-хбитное беззнаковое целое. Вопрос какое максимальное число состоящее из девяток (в десятичном представлении) можно хранить? Сколько девяток максимум возможно?

И с этой точки зрения тоже нельзя.
Потому что double / float -- это не целые.
А числа с нормализованной мантиссой и порядком.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283326
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПотому что double / float -- это не целые.
А числа с нормализованной мантиссой и порядком.
Мы на форуме философов-теоретиков или все-таки технарей? Давай в цифрах рассуждать. Я прекрасно знаю что есть догма "расчеты в числах с плавающей запятой неточны". Я знаю откуда она родилась. Из float , т.к. там мантисса всего 23 бита, 2^23 = 8388608, т.е. даже до 9 десятичных разрядов не дотягивает.

Забудь про float. У double мантисса 52 бита и в них влазит ровно столько сколько влазит в 52 бита, как их логически трактовать вообще без разницы, это просто хранилище емкостью 52 бита.

Вспомни математику, мантисса это именно начало числа (неважно двоичное оно или десятичное), т.е. первые N разрядов, а порядок это просто смещение где поставить разделительную точку. Так вот это N = 52 в двоичной или = 15 в десятичной.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283327
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется в споре о float/double мы просто можем рассмотреть конкретные
случай потери точности (присвоение, добавление копейки, сравнение) и
оценить насколько эти случаи опасны или критичны для финансовой
арифметики. Один случай я очертил. И мантиссу можно уточнить. Там
явно будет не 9*10^15 а другое число.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283332
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМы на форуме философов-теоретиков или все-таки технарей? Давай в цифрах рассуждать. Я прекрасно знаю что есть догма "расчеты в числах с плавающей запятой неточны". Я знаю откуда она родилась. Из float , т.к. там мантисса всего 23 бита, 2^23 = 8388608, т.е. даже до 9 десятичных разрядов не дотягивает.
Дима подожди. Не горячись. Давай применительно к float/double и IEE754
рассмотрим режимы т.н. Floating-Point Behavior
https://msdn.microsoft.com/en-us/library/e7s85ffb.aspx
и как они могут повлиять на результат.

А после этого еще дополним наши тезисы.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283334
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тут и горячиться не надо: используете float/double - добро пожаловать в удивительный мир приближённых вычислений.
А в мире приближённых вычислений надо и за порядком следить и за используемыми формулами, а не только за алгоритмами.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий. Стоп-стоп. У нас есть уже конкретные вопросы. Дима - человек дотошный.
Он ставит вопрос о смысле 52 битов мантиссы. Он считает что есть взаимное и однозначное
соотвенствие между целым числом в 52 бита и double числом где мантисса соотсветствует
этим битам. Я плюсую но дополнительно вспомниаю что есть relaxing the rules - и даю ссылку
на опции Visual C++ и предлагаю обсудить. Я также предлагаю перечислить конкретные кейсы
где double/float будет терять копейки.

А ты возвращаешь нас контекст философии и говоришь дескыть "добро пожаловать в удивительный мир.."

Ну к чему это?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283340
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу к чему это?К тому, что "расширенная плавучка" (80-битный extended) - специфика интел, которая позволяет работать с более высокой точностью на промежуточных вычислениях и разово округлить только конечный результат.
А "удивительный мир приближённых вычислений" при том, что это может (сильно) отличаться "считаем всё в 64-битном представлении".
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283343
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ также предлагаю перечислить конкретные кейсы где double/float будет терять копейкиЭто имеет смысл, когда в результате получается исчерпывающий список причин и рекомендаций. А здесь - явно не тот случай.
"Копейки теряются" вне зависимости от используемых чисел - как только появляются операции деления, могут появиться и дробные копейки. Это вообще никак не зависит от представления числа. Нельзя избежать "дробных копеек" можно только минимизировать вероятность их появления.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283349
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivПотому что double / float -- это не целые.
А числа с нормализованной мантиссой и порядком.
Мы на форуме философов-теоретиков или все-таки технарей? Давай в цифрах рассуждать. Я прекрасно знаю что есть догма "расчеты в числах с плавающей запятой неточны". Я знаю откуда она родилась. Из float , т.к. там мантисса всего 23 бита, 2^23 = 8388608, т.е. даже до 9 десятичных разрядов не дотягивает.



да дело не в этом, какая там мантисса длиной, а в том, что дроби разные, одни десятичные (в представлении людей), другие -- двоичные.

Понятие "иррациональное число" знаешь ? Вот ещё подумай, что рациональное число в одной системе счисления не обязательно является рациональным числом в другой системе счисления.

Примеры -- числа 0.1 и 0.3
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283350
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov"Копейки теряются" вне зависимости от используемых чисел - как только появляются операции деления, могут появиться и дробные копейки. Это вообще никак не зависит от представления числа. Нельзя избежать "дробных копеек" можно только минимизировать вероятность их появления.
Прошу прощения. Я здесь не спорю а просто дополняю. Привожу фрагмент статьи Никлауса Вирта.

http://citforum.ck.ua/programming/digest/wirth/ Представление чисел

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

Однако двоичное представление с использованием двоичных цифр является, очевидно, более экономичным. Для представления целого числа n требуется log10(n) десятичных цифр, но всего лишь log2(n) двоичных цифр (бит). Поскольку для представления десятичной цифры требуется четыре бита, для десятичного представления требуется примерно на 20% больше памяти, чем для двоичного, что показывает очевидное преимущество двоичной формы. Тем не менее, разработчики долгое время сохраняли десятичное представление, и оно присутствует и сегодня в форме библиотечного модуля. Это связано с тем, что разработчики продолжали верить в необходимость точности всех вычислений.

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

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

По поводу давно забытого Card-Raytracer benchmark.
https://sourceforge.net/p/card-raytracer-bench/code/HEAD/tree/trunk/cpp/

Помнится ты заметил что в идентичных сорцах картинки не были численно-точно равны.
Даже при том что мы включили одинаковый конгруэнтный ГПСЧ для всех сорцов и ЯП.
Мы тогда списали это на погрешность вычислений и забили болт. Не стали детально
разбираться.

А я вот щас предполагаю что РЕАЛИЗАЦИЯ работы floating-point вычислений (библиотечные функции,
FPU-80bit (extended double), или инструкции SSE) могли как раз повлиять на результат
при том при всём что стандарт представления числа IEE-754 вобщем не нарушался.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283354
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ здесь не спорю а просто дополняю. Привожу фрагмент статьи Никлауса Вирта.А я говорю о том, что "дробные копейки" - вещь принципиальная и не зависит от представления числа (двоичное или десятичное).
Более того, выбор представления оказывает влияние только для дробных чисел, но любые дробные числа с фиксированной запятой можно превратить в целые путём умножения на целый нормирующий коэффициент.
В результате, представление нас уже не колышет, а вот дробные копейки - продолжают существовать.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283355
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВот ещё подумай, что рациональное число в одной системе счисления не обязательно является рациональным числом в другой системе счисления.
да неужели?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283356
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное имеется в виду что в троичной системе счисления мы можем точно
представить 1/3 а в двоичной будет бесконечная дробная часть близкая к 1/3.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283357
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да понятно, что имелось в виду, но неточность формулировок - вещь опасная.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283358
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivПотому что double / float -- это не целые.
А числа с нормализованной мантиссой и порядком.
Мы на форуме философов-теоретиков или все-таки технарей? Давай в цифрах рассуждать. Я прекрасно знаю что есть догма "расчеты в числах с плавающей запятой неточны". Я знаю откуда она родилась.

значит, все же не знаешь, потому как 1) это не догма, 2) от разрядности неточность не зависит, в смысле, даже увеличивая разряднрсть точности не достичь, поскольку обусловлена она именно формой представления числа.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283359
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Школьную математеку так сильно обрезали, что о бесконечных периодических и непериодических дробях уже не рассказывают?
Мы проходили это в девятом классе средней общеобразовательной школы без всяких "уклонов".
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283360
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv2) от разрядности неточность не зависит, в смысле, даже увеличивая разряднрсть точности не достичь, поскольку обусловлена она именно формой представления числа.Точность зависит от многих факторов и представление - всего лишь один из этих факторов. И далеко не всегда - главный или, хотя бы, определяющий.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283363
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу 15 дес. разрядов. Возможно в этих константах есть некоторые
полезные значения.

http://en.cppreference.com/w/cpp/types/climits

К сожалению на моем жлобском MinGW часть из них нелетают. Может версия протухла.
gcc version 5.3.0 (x86_64-win32-sjlj-rev0, Built by MinGW-W64 project)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283367
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Десятичный логарифм двойки ~= 0,3010 (таблицы Брадиса, если кто в курсе).
Вариант 10**3 == 2**10 проще, но менее точен.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283374
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T...
Мы на форуме философов-теоретиков или все-таки технарей? ...
(как все запущено-то, оказывается)

Не используют floating point numbers для денежных вычислений.
Без теории, на самой что ни на есть практике - не используют .

Не было ни у Кернигана, ни у Риччи цели создавать язык, пригодный для финансовых вычисления.
Ясно и очевидно стояла иная цель - создать такой язык, на котором можно было бы перезапрограммировать наново все, что уже напрограммировано в ЦЕРНе на фортране. Тут, раз нет фортрана без float binary double, то и C без него жить не будет - наличие обязательно.

А Грейс Хоппер ни для чего иного, как для расчета зарплаты свой кобол и не создавал.
Потому там fixed point арифметика вшита до рождения языка. Без нее сам язык смысла не имеет.

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

MasterZiv Ну, нормальная потеря значимости.
О ней booby и говорил.
(задумчиво) ну, sort of...
Строго говоря я говорил о плавающей абсолютной точности.
А "потеря значимости", имхо, чаше обсуждается в контекстах, о которых пишет Basil A. Sidorov.
И, если сложение теряет значащие цифры частично, сохраняя относительную точность результата (15-16 десятичных цифр для binary float),
то вычитание обладает специальным свойством "катастрофической" потери точности, когда в результате может теряться произвольное количество точных десятичных цифр, вплоть до всех 16и разом.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283390
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyDima T...
Мы на форуме философов-теоретиков или все-таки технарей? ...
(как все запущено-то, оказывается)

Не используют floating point numbers для денежных вычислений.
Без теории, на самой что ни на есть практике - не используют .

Не было ни у Кернигана, ни у Риччи цели создавать язык, пригодный для финансовых вычисления.
Ясно и очевидно стояла иная цель - создать такой язык, на котором можно было бы перезапрограммировать наново все, что уже напрограммировано в ЦЕРНе на фортране. Тут, раз нет фортрана без float binary double, то и C без него жить не будет - наличие обязательно.

А Грейс Хоппер ни для чего иного, как для расчета зарплаты свой кобол и не создавал.
Потому там fixed point арифметика вшита до рождения языка. Без нее сам язык смысла не имеет.

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

MasterZiv Ну, нормальная потеря значимости.
О ней booby и говорил.
(задумчиво) ну, sort of...
Строго говоря я говорил о плавающей абсолютной точности.
А "потеря значимости", имхо, чаше обсуждается в контекстах, о которых пишет Basil A. Sidorov.
И, если сложение теряет значащие цифры частично, сохраняя относительную точность результата (15-16 десятичных цифр для binary float),
то вычитание обладает специальным свойством "катастрофической" потери точности, когда в результате может теряться произвольное количество точных десятичных цифр, вплоть до всех 16и разом.

Всё запущено с вашим количество сообщений в ветке Microsoft Access.

Не используют? Вы серьезный финансовый аналитик-программист? Или вы на С/С++ пишите код с утра до вечера? Почитайте пожалуйста, если у вас будет свободное время.

Господин Брайан Керниган не создавал язык Си, и тем более С++.

Дальше вы пишите что может быть что-то при сложение, что-то при вычитании. Не вникая, я могу написать вам тысячу такого рода абстрактных предложений во вставками "может быть", "немаловероятно" и т.д. и т.п. Извольте выражаться конкретней, Дмитрий справедливо заметил выше о том, что мы здесь не философией занимаемся и даже не на собседедовании
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283391
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вы вообще в теме с таким названием умудрились перейти к арифметике?)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283418
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКак вы вообще в теме с таким названием умудрились перейти к арифметике?)стреляли.. (с)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283423
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение тесткейсов...

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#include <math.h>
#include <stdio.h>
#include <stdint.h>

//

#include <bitset>

using namespace std;

// Fucken floating point test
// -----------------------------------
// http://www.h-schmidt.net/FloatConverter/IEEE754.html
// http://en.cppreference.com/w/cpp/types/climits
// https://en.wikipedia.org/wiki/Double-precision_floating-point_format
// https://en.wikipedia.org/wiki/Floating_point
// https://en.wikipedia.org/wiki/Single-precision_floating-point_format 

struct bitcard {    
           uint32_t sign:1;
           uint32_t exponent:8;
           uint32_t mantissa:23;
};

struct bitcard_double {    
           uint64_t sign:1;
           uint64_t exponent:11;
           uint64_t mantissa:53;
};

int main(int argc,char **argv,char **env){

	// [S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM ] 
        //  1       8           23
	union FloatUnion2 {
         float     v;
         struct    bitcard bc;
         uint32_t  iv;
	} fu;

	// [S EEEEEEEEEEE MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMMMMMMMMM MMM ]
	//  1      11                                 53

	union DoubleUnion {
         double    v;   
         struct    bitcard_double bc;
         uint64_t  iv;
	} du;

	fu.v = M_PI; // 3.14159265358979323846
	du.v = M_PI;

	bitset<32> fs(fu.iv);
	bitset<64> ds(du.iv);

	// Float output has been tested with FloatConverter online calculator 1.02f . 
	printf("fu.float     = %f\n",fu.v); 
	//printf("fu.sign      = %01Xh\n",fu.bc.sign);
	//printf("fu.exponent  = %02Xh\n",fu.bc.exponent);
	//printf("fu.mantissa  = %08Xh\n",fu.bc.mantissa);
	
	string fss = fs.to_string();
	printf("fu.raw       = %s\n",fss.c_str()); 
	printf("    sign     = %s\n",fss.substr(0,1).c_str()); 
	printf("    exponent = %s\n",fss.substr(0+1,8).c_str()); 
	printf("    mantissa = %s\n",fss.substr(0+1+8,23).c_str()); 


	printf("du.double    = %.18g\n",  du.v); 
	//printf("du.sign      = %02Xh\n",du.bc.sign);
	//printf("du.exponent  = %03Xh\n",du.bc.exponent);
	string dss = ds.to_string();
	//printf("du.mantissa  = %014Xh\n",du.bc.mantissa);
	printf("du.raw       = %s\n",dss.c_str()); 
	printf("    sign     = %s\n",dss.substr(0,1).c_str()); 
	printf("    exponent = %s\n",dss.substr(0+1,11).c_str()); 
	printf("    mantissa = %s\n",dss.substr(0+1+11,53).c_str()); 

	return 0;

}

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

Давай сначала немного ТЗ восстановим. Началось тут 19473119 где я утверждаю что денежные расчеты можно вести в double если не нужно использовать более 15 десятичных разрядов (чуть перефразировал), тут 19475388 ты усомнился в моем заявлении что в FoxPro все числовые переменные double, сходу не смог, а сейчас нагуглил . Магическое число 15 там упоминается, не я его придумал.

Я не утверждал что возможна абсолютная точность. Есть погрешность преобразования мантиссы и эта погрешность легко считается как 1/2^52 = 2.22*10^-16 точнее мантисса 53 бита, т.к. первый бит всегда единица и просто подразумевается, а не пишется. 1/2^53 = 1.11*10^-16. Это означает что при переводе 15 значного десятичного числа в double и обратно погрешность никак не помешает, главное вовремя округлять.
Не настолько силен в математике чтобы доказывать формулами, поэтому сделал тест перебором преобразования всех 15-тизначных целых чисел в double и обратно.
Правда не быстрый он, за 22 минуты дошел только до 100601824280576 и дальше молотит. Конца дожидаться не буду. Пару часов погоняю, отпишусь чем кончилось.
исходник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void main() {
	for(int64_t x = 100000000000000L; x <= 999999999999999L; x++) {
		double y = x;
		int64_t x2 = y;
		if (x != x2) {printf("error %lld\n", x); break;}
		if((x & 0xFFFFFFF) == 0) printf("test %lld\n", x); 
	}
	printf("finish\n");
}



Запускал в дебаге, чтобы оптимизатор код не упростил, вот с асмом
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
void main() {
000000013FFB2690  push        rbp  
000000013FFB2692  push        rdi  
000000013FFB2693  sub         rsp,148h  
000000013FFB269A  lea         rbp,[rsp+20h]  
000000013FFB269F  mov         rdi,rsp  
000000013FFB26A2  mov         ecx,52h  
000000013FFB26A7  mov         eax,0CCCCCCCCh  
000000013FFB26AC  rep stos    dword ptr [rdi]  
	for(int64_t x = 100000000000000L; x <= 999999999999999L; x++) {
000000013FFB26AE  mov         rax,5AF3107A4000h  
000000013FFB26B8  mov         qword ptr [rbp+8],rax  
000000013FFB26BC  jmp         main+39h (013FFB26C9h)  
000000013FFB26BE  mov         rax,qword ptr [rbp+8]  
000000013FFB26C2  inc         rax  
000000013FFB26C5  mov         qword ptr [rbp+8],rax  
000000013FFB26C9  mov         rax,38D7EA4C67FFFh  
000000013FFB26D3  cmp         qword ptr [rbp+8],rax  
000000013FFB26D7  jg          main+9Bh (013FFB272Bh)  
		double y = x;
000000013FFB26D9  cvtsi2sd    xmm0,qword ptr [rbp+8]  
000000013FFB26DF  movsd       mmword ptr [rbp+28h],xmm0  
		int64_t x2 = y;
000000013FFB26E4  cvttsd2si   rax,mmword ptr [rbp+28h]  
000000013FFB26EA  mov         qword ptr [rbp+48h],rax  
		if (x != x2) {printf("error %lld\n", x); break;}
000000013FFB26EE  mov         rax,qword ptr [rbp+48h]  
000000013FFB26F2  cmp         qword ptr [rbp+8],rax  
000000013FFB26F6  je          main+7Ah (013FFB270Ah)  
		if (x != x2) {printf("error %lld\n", x); break;}
000000013FFB26F8  mov         rdx,qword ptr [rbp+8]  
000000013FFB26FC  lea         rcx,[string "error %lld\n" (013FFBADC0h)]  
000000013FFB2703  call        printf (013FFB1280h)  
000000013FFB2708  jmp         main+9Bh (013FFB272Bh)  
		if((x & 0xFFFFFFF) == 0) printf("test %lld\n", x); 
000000013FFB270A  mov         rax,qword ptr [rbp+8]  
000000013FFB270E  and         rax,0FFFFFFFh  
000000013FFB2714  test        rax,rax  
000000013FFB2717  jne         main+99h (013FFB2729h)  
000000013FFB2719  mov         rdx,qword ptr [rbp+8]  
000000013FFB271D  lea         rcx,[string "test %lld\n" (013FFBADD0h)]  
000000013FFB2724  call        printf (013FFB1280h)  
	}
000000013FFB2729  jmp         main+2Eh (013FFB26BEh)  
	printf("finish\n");
000000013FFB272B  lea         rcx,[string "finish\n" (013FFBADE0h)]  
000000013FFB2732  call        printf (013FFB1280h)  
}





PS Для float погрешность 1/2^24 = 5.96*10^-8. Т.е. точно можно оперировать 7-ю знаками, для денег это маловато, т.к. максимум будет 99999.99 а дальше погрешности вылезут.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283435
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПомнится ты заметил что в идентичных сорцах картинки не были численно-точно равны.
Даже при том что мы включили одинаковый конгруэнтный ГПСЧ для всех сорцов и ЯП.
Мы тогда списали это на погрешность вычислений и забили болт. Не стали детально
разбираться.
Забили, но было правдоподобное объяснение что в разных ЯП параметры могут читаться в разном порядке, т.е. даже при одинаковой последовательности будут разные результаты. Например f(rand(), rand()). Там были такие подозрительные места в коде.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283437
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗабили, но было правдоподобное объяснение что в разных ЯП параметры могут читаться в разном порядке, т.е. даже при одинаковой последовательности будут разные результаты. Например f(rand(), rand()). Там были такие подозрительные места в коде.
Ну это легко фиксится introduce temp var.

Код: plaintext
1.
2.
3.
int R1 = rand();
int R2 = rand();
f(R1,R2);
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283441
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу это легко фиксится introduce temp var.
ХЗ, оптимизатор превратит это обратно в f(rand(), rand()), а то и еще во что похуже, а ограничивать оптимизатор - порушить всю нашу идею замеров скорости. Потому и забили. Как-то так мне припоминается.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283444
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХЗ, оптимизатор превратит это обратно в f(rand(), rand()),
серьёзно?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283446
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TХЗ, оптимизатор превратит это обратно в f(rand(), rand()),
серьёзно?
я ж написал ХЗ, т.е. сомневаюсь но возможно :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283451
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилсерьёзно?
Вполне: и компилятор и процессор вольны менять порядок независимых (с их точки зрения)
операций вплоть до параллельного исполнения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283454
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати задумался... возможно ли написать честную последовательность float/double псевдо случайных
величин по линейному закону.

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

Прошло два часа, досчитало до 103329396948992, считает дальше. Ошибок не было.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283459
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИзопропилсерьёзно?
Вполне: и компилятор и процессор вольны менять порядок независимых (с их точки зрения)
операций вплоть до параллельного исполнения.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int get() { static int s = 0; return s++; };
void quest(int a, int b) {
	printf("%i %i\n", a, b);
};
....
	int x = get();
	int y = get();
	quest(x, y);


может напечатать 1 0 ?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283463
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилможет напечатать 1 0 ?
Был неправ, признаю: ни вызовы get(), ни rand() оно не перепутает из-за внутренних
побочных эффектов, что создаёт их зависимость.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283465
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу это легко фиксится introduce temp var.
Не очень легко. Я исходники глянул и вспомнил почему поверил на слово без проверки. С++ и C# . Код заметно отличается т.к. в C# пришлось отказаться от перегрузки +,- и т.д. из-за того что тормозит она в шарпе.
А т.к. rand() много где вызывается, то не стал связываться с проверкой предложенной гипотезы, слишком муторно там все подгонять чтобы порядок соблюсти.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283467
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКстати задумался... возможно ли написать честную последовательность float/double псевдо случайных
величин по линейному закону.

Сама плотность значений float/double распределена по вещесвенной оси изначально неравномерно.
А нужна ли она? Если под словом "честная" понимается весь допустимый диапазон, т.е. от 10^-308 до 10^308, то какое возможно практическое применение?

Есть реализации работающие в диапазоне 0-1, например в C# Random.NextDouble()
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283468
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел исходники Random.NextDouble() http://referencesource.microsoft.com/#mscorlib/system/random.cs,4c2fc83207c654d1
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
      public virtual double NextDouble() {
        return Sample(); 
      } 

      protected virtual double Sample() {
          //Including this division at the end gives us significantly improved
          //random number distribution.
          return (InternalSample()*(1.0/MBIG));
      }
    
      private int InternalSample() {
          int retVal;
          int locINext = inext;
          int locINextp = inextp;
 
          if (++locINext >=56) locINext=1;
          if (++locINextp>= 56) locINextp = 1;
          
          retVal = SeedArray[locINext]-SeedArray[locINextp];
 
          if (retVal == MBIG) retVal--;          
          if (retVal<0) retVal+=MBIG;
          
          SeedArray[locINext]=retVal;
 
          inext = locINext;
          inextp = locINextp;
                    
          return retVal;
      }


Не стал МС с double заморачиваться, последовательность генерится в int`ах, а в double только конвертируется.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283480
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

интересно, как ты себе представляешь линейный конгруэнтный гпсч в плавучке
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283482
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SashaMercury,

Саша, ты совсем зря все буквы использованного тобой алфавита истратил, от первой до последней.

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

Судя по всему, ты занимаешься преждевременным чтением.
Лучше было бы, если бы учил буквы Марсианского алфавита.
Предложенное тобой чтение - для старших курсов, только для тех, кто азбуку уже осилил.


автор...Не вникая...
а вот это ты мощно задвинул. Здесь жирный плюс. Так и продолжай дальше - не вникая .
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283494
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение 19478638 . Прошло 6 часов перебора и пройдено 1% диапазона, до 110106318471168 и продолжает молотить. 600 часов как-то многовато, можно и проц сжечь. Вырубил.

Поразмышлял над аргументами о преобразовании. Преобразование 2-10 вообще не проблема, т.к. по-большому счету оно нужно только при выводе, а хранение и расчеты идут в двоичном виде. Т.е. тут все отлично лечится своевременным применением value = round(value, N), где N требуемое число разрядов запятой, используемое при хранении. round() функция не быстрая, но если бы ее реализовали аппаратно в проце, то и юзали бы все double для точных расчетов.

У всяких суррогатов типа как money, smallmoney у MSSQL (использование int32 или int64 для хранения и виртуальный сдвиг точки на 4 разряда при выводе) тоже ведь не все идеально, начни там делить и начнутся проблемы. Например в фоксе есть подобный тип currency, пробуем выделить НДС 18% и вот что имеем
Код: plaintext
1.
2.
3.
x = $1
? x / $1.18 * $0.18 && = 0.1526
? x  * $0.18 / $1.18 && = 0.1525


и тоже в double
Код: plaintext
1.
2.
3.
y = 1
? y / 1.18 * 0.18 && = 0.15254237
? y  * 0.18 / 1.18 && = 0.152542


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

открой тайну - чему равно 997654321054321 / 1.00000000000004 ?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283504
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

опечатка -
987654321054321 / 1.00000000000004
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283507
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

открой тайну - чему равно 997 654 321 054 321 / 1.000 000 000 000 04 ?
Не открою, т.к. тут попытка оперирования числами общей разрядностью 29 знаков. Бери какую-нибудь мат-либу и считай.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283509
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпопытка оперирования числами общей разрядностью 29 знаков
мне казалось - оба 15-разрядные, да и результат 15-разрядный хочу.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283511
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima Tпопытка оперирования числами общей разрядностью 29 знаков
мне казалось - оба 15-разрядные, да и результат 15-разрядный хочу.
Приведи сначала оба числа в единую разрядность, т.е.
Код: plaintext
997 654 321 054 321.000 000 000 000 00 / 000 000 000 000 001.000 000 000 000 04
а потом посчитай сколько разрядов используется.
Хотеть не вредно, бери мат.либу и реализуй свои хотелки.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283513
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТолько мне кажется что во втором случае повыше точность?
Мне кажется это неверная постановка вопроса. Мы не должны
искать способа повышать точность. Мы должны очертить класс
операций которые позволяют нам работать с double недеструктивно.

По поводу присвоений. Твой замечательный цикл который сейчас
греет твой кусок кремния и твою комнату имеет мало пользы.
Я предлагаю его упростить и взять множество ключевых констант
MIN_DOUBLE, MAX_DOUBLE ... etc и различные варианты
"бегущего бита" или множества значений десятичной системы
таких как 9, 99, 999 e.t.c. И проверить только на них и сделать выводы.

По поводу целочисленного деления. Как верно было сказано, точность
последней копейки может плавать в зависимости от типа данных.
BCD-арифметика даёт бухгалтерское (клеточное) деление.
Двоичная целочисленная может дать другой результат. И наш
волшебный double-тип может дать еще более парадоксальный результат.
Если я ошибся - то прошу поправить.

Почему я настойчиво вопрошаю к сообществу.

Предлагаю брать за эталон Oracle-NUMBER, или бухгалтерский
калькулятор Sharp/Citizen для проверки точности делений.
Или любой другой финансовый тип.

Частное от деление денег на деньги или денег на целое должно давать в
последнем знаке ожидаемый результат.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283515
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХотеть не вредно
а вот double использовать вместо decimal - вредно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283520
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TХотеть не вредно
а вот double использовать вместо decimal - вредно.
Если ты про decimal из C#, то это удел только .net, в других ЯП подобное не замечал. Тут вообще-то форум по С/С++. Соглашусь что decimal один из наилучших велосипедов, 128 бит это 128 бит, но тоже не идеальный.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283521
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TТолько мне кажется что во втором случае повыше точность?
Мне кажется это неверная постановка вопроса. Мы не должны
искать способа повышать точность. Мы должны очертить класс
операций которые позволяют нам работать с double недеструктивно.
Так я и показал тестом что double недеструктивен, т.е. вполне точен. но не надо от него чудес ожидать, типа 19479327 . Если в целочисленных типах происходит переполнение, а в плавающих потеря точности, то это не баг, а фича, которой надо уметь грамотно пользоваться, а не тупо утверждать что double неточен по определению.
Но есть минусы double, я их тоже указывал: сравнение, сортировка как следствие, что не дает его полноценно использовать для значений с фиксированной разрядностью.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283522
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли ты про decimal из C#,
он там кривой(точность нельзя задать).
нормальный в коболе и наследниках
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283524
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж про полноценные десятичные типы, то у меня был инцидент. Тип NUMERIC в dbf, реально хранится как строка десятичных цифр. Фокс все отлично посчитал (используя double) но поле было N(10,2), а значение туда не влазило и сохранилось как N(10,1), такая вот баго-фича, строка то читаема, а я огреб по полной от бухгалтерии, которая потеряла пару копеек в десятках миллионов.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283526
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилон там кривой(точность нельзя задать).
И это тоже, но и производительность с ним не та. Мне надо было быстрый парсер кучи файлов с кучей цен. Просто перегнать один формат в другой. И double гораздо быстрее чем decimal. Оно и понятно: нативный тип понимаемый процом против самодельной структуры от МС.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283528
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПриведи сначала оба числа в единую разрядность
При операциях с числами с плавающей точкой они уже в одной разрядности:
0.987654321054321*10 15 и 0.100000000000004*10 -1 .
Мантисы перемножаются отдельно, показатели складываются отдельно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283530
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМне надо было быстрый парсер кучи файлов с кучей цен
это скорее обработка текста, а не вычисления
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283531
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TПриведи сначала оба числа в единую разрядность
При операциях с числами с плавающей точкой они уже в одной разрядности:
0.987654321054321*10 15 и 0.100000000000004*10 -1 .
Мантисы перемножаются отдельно, показатели складываются отдельно.
Не надо про сферических коней, почитай вступление 19478638 , речь про double как альтернативе расчетам с числами с фиксированной разрядностью.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283534
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпочитай вступление
Если уж читать вступление, так с того места, где кое-кто спутал финансистов с бухгалтерами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283535
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TМне надо было быстрый парсер кучи файлов с кучей цен
это скорее обработка текста, а не вычисления
текст 10 во внутренние 2 (double или decimal) потом обратно в текст 10. Это тоже вычисления. И по факту double оказалось быстрее, да и косяки с разрядностью decimal при выводе еще вылезли. Разговор ведь про общее использование, в т.ч. и такое. Это просто частный случай, демонстрирующий что нет идеального решения проблем работы с числами с фиксированной разрядностью.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283536
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima Tпочитай вступление
Если уж читать вступление, так с того места, где кое-кто спутал финансистов с бухгалтерами.

если ты про это 19479458 , то огреб я от главбуха тогда.
В остальном тут топик вообще про inline, поэтому остальное читай по диагонали, как субтопики :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283539
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто просто частный случай, демонстрирующий что нет идеального решения проблем работы с числами с фиксированной разрядностью.
BINARY FIXED(n,m)
DECIMAL FIXED(n,m)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283540
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилBINARY FIXED(n,m)
DECIMAL FIXED(n,m)
Краткость - сестра таланта, но тут непонятно из какой оперы эти понятия. Ссылку бы дал, или еще как-то намекнул о чем речь.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283542
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

это PL/1
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283556
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Челы. Толи от воскресенья... толи от количества выпитого пива туплю.

Глянте плиз пред ваши ясны очи.

На каждой нечетной итерации мантисса удваивает свое значение. На четной - добавляет единицу.

DoubleFormat после некой итерации перестает изменять свое raw-значение.
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>     
#include <time.h>       

#include <bitset>

using namespace std;

string formatFloatRaw(float arg1){
	union {
		float    v;
		uint32_t iv;
	} fu2;
	fu2.v = arg1;
	bitset<32>   fs(fu2.iv);
	string dss = fs.to_string();
	return dss.substr(0,1)    +"-"+
               dss.substr(0+1,8) +"-"+
               dss.substr(0+1+8,23);
}


string formatDoubleRaw(double arg1){
	union {
		double   v;
		uint64_t iv;
	} du2;
	du2.v = arg1;
	bitset<32>   dshi ((uint32_t)(du2.iv>>32));
	bitset<32>   dslow((uint32_t)(du2.iv&&0xFFFFFFFF));
	bitset<64>   ds(dshi.to_string() + dslow.to_string());
	string dss = ds.to_string();
	return dss.substr(0,1)    +"-"+
               dss.substr(0+1,11) +"-"+
               dss.substr(0+1+11,53);
}


#define MAX_MANT_DOUBLE 999999999999999.0

int main(int argc,char **argv,char **env){

	srand(0);
        
	// Float running bit
	float v=1.0f;
	for(int i=0;i<26;i++){
		printf("float = %f \t raw = %s \n",v,formatFloatRaw(v).c_str());
		printf("float = %f \t raw = %s \n",v+1.0f,formatFloatRaw(v+1.0f).c_str());
		v*=2.0f;
	}

	// Double running bit
	double vd=1.0;
	for(int i=0;i<60;i++){
		printf("double = %f \t raw = %s \n",vd,formatDoubleRaw(vd).c_str());
		printf("double = %f \t raw = %s \n",vd+1.0,formatDoubleRaw(vd+1.0).c_str());
		vd*=2.0;
	}

	return 0;
}



Отчотик

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
float = 1.000000 	 raw = 0-01111111-00000000000000000000000 
float = 2.000000 	 raw = 0-10000000-00000000000000000000000 
float = 2.000000 	 raw = 0-10000000-00000000000000000000000 
float = 3.000000 	 raw = 0-10000000-10000000000000000000000 
float = 4.000000 	 raw = 0-10000001-00000000000000000000000 
float = 5.000000 	 raw = 0-10000001-01000000000000000000000 
float = 8.000000 	 raw = 0-10000010-00000000000000000000000 
float = 9.000000 	 raw = 0-10000010-00100000000000000000000 
float = 16.000000 	 raw = 0-10000011-00000000000000000000000 
float = 17.000000 	 raw = 0-10000011-00010000000000000000000 
float = 32.000000 	 raw = 0-10000100-00000000000000000000000 
float = 33.000000 	 raw = 0-10000100-00001000000000000000000 
float = 64.000000 	 raw = 0-10000101-00000000000000000000000 
float = 65.000000 	 raw = 0-10000101-00000100000000000000000 
float = 128.000000 	 raw = 0-10000110-00000000000000000000000 
float = 129.000000 	 raw = 0-10000110-00000010000000000000000 
float = 256.000000 	 raw = 0-10000111-00000000000000000000000 
float = 257.000000 	 raw = 0-10000111-00000001000000000000000 
float = 512.000000 	 raw = 0-10001000-00000000000000000000000 
float = 513.000000 	 raw = 0-10001000-00000000100000000000000 
float = 1024.000000 	 raw = 0-10001001-00000000000000000000000 
float = 1025.000000 	 raw = 0-10001001-00000000010000000000000 
float = 2048.000000 	 raw = 0-10001010-00000000000000000000000 
float = 2049.000000 	 raw = 0-10001010-00000000001000000000000 
float = 4096.000000 	 raw = 0-10001011-00000000000000000000000 
float = 4097.000000 	 raw = 0-10001011-00000000000100000000000 
float = 8192.000000 	 raw = 0-10001100-00000000000000000000000 
float = 8193.000000 	 raw = 0-10001100-00000000000010000000000 
float = 16384.000000 	 raw = 0-10001101-00000000000000000000000 
float = 16385.000000 	 raw = 0-10001101-00000000000001000000000 
float = 32768.000000 	 raw = 0-10001110-00000000000000000000000 
float = 32769.000000 	 raw = 0-10001110-00000000000000100000000 
float = 65536.000000 	 raw = 0-10001111-00000000000000000000000 
float = 65537.000000 	 raw = 0-10001111-00000000000000010000000 
float = 131072.000000 	 raw = 0-10010000-00000000000000000000000 
float = 131073.000000 	 raw = 0-10010000-00000000000000001000000 
float = 262144.000000 	 raw = 0-10010001-00000000000000000000000 
float = 262145.000000 	 raw = 0-10010001-00000000000000000100000 
float = 524288.000000 	 raw = 0-10010010-00000000000000000000000 
float = 524289.000000 	 raw = 0-10010010-00000000000000000010000 
float = 1048576.000000 	 raw = 0-10010011-00000000000000000000000 
float = 1048577.000000 	 raw = 0-10010011-00000000000000000001000 
float = 2097152.000000 	 raw = 0-10010100-00000000000000000000000 
float = 2097153.000000 	 raw = 0-10010100-00000000000000000000100 
float = 4194304.000000 	 raw = 0-10010101-00000000000000000000000 
float = 4194305.000000 	 raw = 0-10010101-00000000000000000000010 
float = 8388608.000000 	 raw = 0-10010110-00000000000000000000000 
float = 8388609.000000 	 raw = 0-10010110-00000000000000000000001 
float = 16777216.000000 	 raw = 0-10010111-00000000000000000000000 
float = 16777216.000000 	 raw = 0-10010111-00000000000000000000000 
float = 33554432.000000 	 raw = 0-10011000-00000000000000000000000 
float = 33554432.000000 	 raw = 0-10011000-00000000000000000000000 
double = 1.000000 	 raw = 0-01111111111-0000000000000000000000000000000000000000000000000001 
double = 2.000000 	 raw = 0-10000000000-0000000000000000000000000000000000000000000000000001 
double = 2.000000 	 raw = 0-10000000000-0000000000000000000000000000000000000000000000000001 
double = 3.000000 	 raw = 0-10000000000-1000000000000000000000000000000000000000000000000001 
double = 4.000000 	 raw = 0-10000000001-0000000000000000000000000000000000000000000000000001 
double = 5.000000 	 raw = 0-10000000001-0100000000000000000000000000000000000000000000000001 
double = 8.000000 	 raw = 0-10000000010-0000000000000000000000000000000000000000000000000001 
double = 9.000000 	 raw = 0-10000000010-0010000000000000000000000000000000000000000000000001 
double = 16.000000 	 raw = 0-10000000011-0000000000000000000000000000000000000000000000000001 
double = 17.000000 	 raw = 0-10000000011-0001000000000000000000000000000000000000000000000001 
double = 32.000000 	 raw = 0-10000000100-0000000000000000000000000000000000000000000000000001 
double = 33.000000 	 raw = 0-10000000100-0000100000000000000000000000000000000000000000000001 
double = 64.000000 	 raw = 0-10000000101-0000000000000000000000000000000000000000000000000001 
double = 65.000000 	 raw = 0-10000000101-0000010000000000000000000000000000000000000000000001 
double = 128.000000 	 raw = 0-10000000110-0000000000000000000000000000000000000000000000000001 
double = 129.000000 	 raw = 0-10000000110-0000001000000000000000000000000000000000000000000001 
double = 256.000000 	 raw = 0-10000000111-0000000000000000000000000000000000000000000000000001 
double = 257.000000 	 raw = 0-10000000111-0000000100000000000000000000000000000000000000000001 
double = 512.000000 	 raw = 0-10000001000-0000000000000000000000000000000000000000000000000001 
double = 513.000000 	 raw = 0-10000001000-0000000010000000000000000000000000000000000000000001 
double = 1024.000000 	 raw = 0-10000001001-0000000000000000000000000000000000000000000000000001 
double = 1025.000000 	 raw = 0-10000001001-0000000001000000000000000000000000000000000000000001 
double = 2048.000000 	 raw = 0-10000001010-0000000000000000000000000000000000000000000000000001 
double = 2049.000000 	 raw = 0-10000001010-0000000000100000000000000000000000000000000000000001 
double = 4096.000000 	 raw = 0-10000001011-0000000000000000000000000000000000000000000000000001 
double = 4097.000000 	 raw = 0-10000001011-0000000000010000000000000000000000000000000000000001 
double = 8192.000000 	 raw = 0-10000001100-0000000000000000000000000000000000000000000000000001 
double = 8193.000000 	 raw = 0-10000001100-0000000000001000000000000000000000000000000000000001 
double = 16384.000000 	 raw = 0-10000001101-0000000000000000000000000000000000000000000000000001 
double = 16385.000000 	 raw = 0-10000001101-0000000000000100000000000000000000000000000000000001 
double = 32768.000000 	 raw = 0-10000001110-0000000000000000000000000000000000000000000000000001 
double = 32769.000000 	 raw = 0-10000001110-0000000000000010000000000000000000000000000000000001 
double = 65536.000000 	 raw = 0-10000001111-0000000000000000000000000000000000000000000000000001 
double = 65537.000000 	 raw = 0-10000001111-0000000000000001000000000000000000000000000000000001 
double = 131072.000000 	 raw = 0-10000010000-0000000000000000000000000000000000000000000000000001 
double = 131073.000000 	 raw = 0-10000010000-0000000000000000100000000000000000000000000000000001 
double = 262144.000000 	 raw = 0-10000010001-0000000000000000000000000000000000000000000000000001 
double = 262145.000000 	 raw = 0-10000010001-0000000000000000010000000000000000000000000000000001 
double = 524288.000000 	 raw = 0-10000010010-0000000000000000000000000000000000000000000000000001 
double = 524289.000000 	 raw = 0-10000010010-0000000000000000001000000000000000000000000000000001 
double = 1048576.000000 	 raw = 0-10000010011-0000000000000000000000000000000000000000000000000001 
double = 1048577.000000 	 raw = 0-10000010011-0000000000000000000100000000000000000000000000000001 
double = 2097152.000000 	 raw = 0-10000010100-0000000000000000000000000000000000000000000000000001 
double = 2097153.000000 	 raw = 0-10000010100-0000000000000000000000000000000000000000000000000001 
double = 4194304.000000 	 raw = 0-10000010101-0000000000000000000000000000000000000000000000000001 
double = 4194305.000000 	 raw = 0-10000010101-0000000000000000000000000000000000000000000000000001 
double = 8388608.000000 	 raw = 0-10000010110-0000000000000000000000000000000000000000000000000001 
double = 8388609.000000 	 raw = 0-10000010110-0000000000000000000000000000000000000000000000000001 
double = 16777216.000000 	 raw = 0-10000010111-0000000000000000000000000000000000000000000000000001 
double = 16777217.000000 	 raw = 0-10000010111-0000000000000000000000000000000000000000000000000001 
double = 33554432.000000 	 raw = 0-10000011000-0000000000000000000000000000000000000000000000000001 
double = 33554433.000000 	 raw = 0-10000011000-0000000000000000000000000000000000000000000000000001 
double = 67108864.000000 	 raw = 0-10000011001-0000000000000000000000000000000000000000000000000001 
double = 67108865.000000 	 raw = 0-10000011001-0000000000000000000000000000000000000000000000000001 
double = 134217728.000000 	 raw = 0-10000011010-0000000000000000000000000000000000000000000000000001 
double = 134217729.000000 	 raw = 0-10000011010-0000000000000000000000000000000000000000000000000001 
double = 268435456.000000 	 raw = 0-10000011011-0000000000000000000000000000000000000000000000000001 
double = 268435457.000000 	 raw = 0-10000011011-0000000000000000000000000000000000000000000000000001 
double = 536870912.000000 	 raw = 0-10000011100-0000000000000000000000000000000000000000000000000001 
double = 536870913.000000 	 raw = 0-10000011100-0000000000000000000000000000000000000000000000000001 
double = 1073741824.000000 	 raw = 0-10000011101-0000000000000000000000000000000000000000000000000001 
double = 1073741825.000000 	 raw = 0-10000011101-0000000000000000000000000000000000000000000000000001 
double = 2147483648.000000 	 raw = 0-10000011110-0000000000000000000000000000000000000000000000000001 
double = 2147483649.000000 	 raw = 0-10000011110-0000000000000000000000000000000000000000000000000001 
double = 4294967296.000000 	 raw = 0-10000011111-0000000000000000000000000000000000000000000000000001 
double = 4294967297.000000 	 raw = 0-10000011111-0000000000000000000000000000000000000000000000000001 
double = 8589934592.000000 	 raw = 0-10000100000-0000000000000000000000000000000000000000000000000001 
double = 8589934593.000000 	 raw = 0-10000100000-0000000000000000000000000000000000000000000000000001 
double = 17179869184.000000 	 raw = 0-10000100001-0000000000000000000000000000000000000000000000000001 
double = 17179869185.000000 	 raw = 0-10000100001-0000000000000000000000000000000000000000000000000001 
double = 34359738368.000000 	 raw = 0-10000100010-0000000000000000000000000000000000000000000000000001 
double = 34359738369.000000 	 raw = 0-10000100010-0000000000000000000000000000000000000000000000000001 
double = 68719476736.000000 	 raw = 0-10000100011-0000000000000000000000000000000000000000000000000001 
double = 68719476737.000000 	 raw = 0-10000100011-0000000000000000000000000000000000000000000000000001 
double = 137438953472.000000 	 raw = 0-10000100100-0000000000000000000000000000000000000000000000000001 
double = 137438953473.000000 	 raw = 0-10000100100-0000000000000000000000000000000000000000000000000001 
double = 274877906944.000000 	 raw = 0-10000100101-0000000000000000000000000000000000000000000000000001 
double = 274877906945.000000 	 raw = 0-10000100101-0000000000000000000000000000000000000000000000000001 
double = 549755813888.000000 	 raw = 0-10000100110-0000000000000000000000000000000000000000000000000001 
double = 549755813889.000000 	 raw = 0-10000100110-0000000000000000000000000000000000000000000000000001 
double = 1099511627776.000000 	 raw = 0-10000100111-0000000000000000000000000000000000000000000000000001 
double = 1099511627777.000000 	 raw = 0-10000100111-0000000000000000000000000000000000000000000000000001 
double = 2199023255552.000000 	 raw = 0-10000101000-0000000000000000000000000000000000000000000000000001 
double = 2199023255553.000000 	 raw = 0-10000101000-0000000000000000000000000000000000000000000000000001 
double = 4398046511104.000000 	 raw = 0-10000101001-0000000000000000000000000000000000000000000000000001 
double = 4398046511105.000000 	 raw = 0-10000101001-0000000000000000000000000000000000000000000000000001 
double = 8796093022208.000000 	 raw = 0-10000101010-0000000000000000000000000000000000000000000000000001 
double = 8796093022209.000000 	 raw = 0-10000101010-0000000000000000000000000000000000000000000000000001 
double = 17592186044416.000000 	 raw = 0-10000101011-0000000000000000000000000000000000000000000000000001 
double = 17592186044417.000000 	 raw = 0-10000101011-0000000000000000000000000000000000000000000000000001 
double = 35184372088832.000000 	 raw = 0-10000101100-0000000000000000000000000000000000000000000000000001 
double = 35184372088833.000000 	 raw = 0-10000101100-0000000000000000000000000000000000000000000000000001 
double = 70368744177664.000000 	 raw = 0-10000101101-0000000000000000000000000000000000000000000000000001 
double = 70368744177665.000000 	 raw = 0-10000101101-0000000000000000000000000000000000000000000000000001 
double = 140737488355328.000000 	 raw = 0-10000101110-0000000000000000000000000000000000000000000000000001 
double = 140737488355329.000000 	 raw = 0-10000101110-0000000000000000000000000000000000000000000000000001 
double = 281474976710656.000000 	 raw = 0-10000101111-0000000000000000000000000000000000000000000000000001 
double = 281474976710657.000000 	 raw = 0-10000101111-0000000000000000000000000000000000000000000000000001 
double = 562949953421312.000000 	 raw = 0-10000110000-0000000000000000000000000000000000000000000000000001 
double = 562949953421313.000000 	 raw = 0-10000110000-0000000000000000000000000000000000000000000000000001 
double = 1125899906842624.000000 	 raw = 0-10000110001-0000000000000000000000000000000000000000000000000001 
double = 1125899906842625.000000 	 raw = 0-10000110001-0000000000000000000000000000000000000000000000000001 
double = 2251799813685248.000000 	 raw = 0-10000110010-0000000000000000000000000000000000000000000000000001 
double = 2251799813685249.000000 	 raw = 0-10000110010-0000000000000000000000000000000000000000000000000001 
double = 4503599627370496.000000 	 raw = 0-10000110011-0000000000000000000000000000000000000000000000000001 
double = 4503599627370497.000000 	 raw = 0-10000110011-0000000000000000000000000000000000000000000000000001 
double = 9007199254740992.000000 	 raw = 0-10000110100-0000000000000000000000000000000000000000000000000001 
double = 9007199254740992.000000 	 raw = 0-10000110100-0000000000000000000000000000000000000000000000000001 
double = 18014398509481984.000000 	 raw = 0-10000110101-0000000000000000000000000000000000000000000000000001 
double = 18014398509481984.000000 	 raw = 0-10000110101-0000000000000000000000000000000000000000000000000001 
double = 36028797018963968.000000 	 raw = 0-10000110110-0000000000000000000000000000000000000000000000000001 
double = 36028797018963968.000000 	 raw = 0-10000110110-0000000000000000000000000000000000000000000000000001 
double = 72057594037927936.000000 	 raw = 0-10000110111-0000000000000000000000000000000000000000000000000001 
double = 72057594037927936.000000 	 raw = 0-10000110111-0000000000000000000000000000000000000000000000000001 
double = 144115188075855870.000000 	 raw = 0-10000111000-0000000000000000000000000000000000000000000000000001 
double = 144115188075855870.000000 	 raw = 0-10000111000-0000000000000000000000000000000000000000000000000001 
double = 288230376151711740.000000 	 raw = 0-10000111001-0000000000000000000000000000000000000000000000000001 
double = 288230376151711740.000000 	 raw = 0-10000111001-0000000000000000000000000000000000000000000000000001 
double = 576460752303423490.000000 	 raw = 0-10000111010-0000000000000000000000000000000000000000000000000001 
double = 576460752303423490.000000 	 raw = 0-10000111010-0000000000000000000000000000000000000000000000000001 

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

dslow((uint32_t)(du2.iv && 0xFFFFFFFF));
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283624
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин...
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283635
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выводи в hex, в нем смотреть удобнее
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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;
}

char* float2hex(float x, char* buf) {
	uint32_t v = *((uint32_t*)&x);

	sprintf(buf, "%03X-%06X", (v & 0xFF800000) >> 23, v & 0x7FFFFF);
	return buf;
}



void main(int argc, char**argv) {
	char buf[256];

	double x = 1.;
	for (int i = 0; i < 16; i++) {
		printf("%3.0f => %s\n", x, double2hex(x, buf));
		x += 1.;
	}

	float y = 1.;
	for (int i = 0; i < 16; i++) {
		printf("%3.0f => %s\n", y, float2hex(y, buf));
		y += 1.;
	}
	printf("%s\n", double2hex(1. / 3., buf));
	printf("%s\n", float2hex(1. / 3., buf));
}


Результат
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
  1 => 3FF-0000000000000
  2 => 400-0000000000000
  3 => 400-8000000000000
  4 => 401-0000000000000
  5 => 401-4000000000000
  6 => 401-8000000000000
  7 => 401-C000000000000
  8 => 402-0000000000000
  9 => 402-2000000000000
 10 => 402-4000000000000
 11 => 402-6000000000000
 12 => 402-8000000000000
 13 => 402-A000000000000
 14 => 402-C000000000000
 15 => 402-E000000000000
 16 => 403-0000000000000
  1 => 07F-000000
  2 => 080-000000
  3 => 080-400000
  4 => 081-000000
  5 => 081-200000
  6 => 081-400000
  7 => 081-600000
  8 => 082-000000
  9 => 082-100000
 10 => 082-200000
 11 => 082-300000
 12 => 082-400000
 13 => 082-500000
 14 => 082-600000
 15 => 082-700000
 16 => 083-000000
3FD-5555555555555
07D-2AAAAB
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283674
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем удобно. Группы битов sign-exponent-mantissa не кратны 4. Граница пересекает 1-hex символ.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283679
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сдвигами лечится.

PS у тебя еще в double с мантиссой косяк, не 53, а 52
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283687
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Выводи в hex, в нем смотреть удобнее
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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;
}

char* float2hex(float x, char* buf) {
	uint32_t v = *((uint32_t*)&x);

	sprintf(buf, "%03X-%06X", (v & 0xFF800000) >> 23, v & 0x7FFFFF);
	return buf;
}



void main(int argc, char**argv) {
	char buf[256];

	double x = 1.;
	for (int i = 0; i < 16; i++) {
		printf("%3.0f => %s\n", x, double2hex(x, buf));
		x += 1.;
	}

	float y = 1.;
	for (int i = 0; i < 16; i++) {
		printf("%3.0f => %s\n", y, float2hex(y, buf));
		y += 1.;
	}
	printf("%s\n", double2hex(1. / 3., buf));
	printf("%s\n", float2hex(1. / 3., buf));
}


Результат
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
  1 => 3FF-0000000000000
  2 => 400-0000000000000
  3 => 400-8000000000000
  4 => 401-0000000000000
  5 => 401-4000000000000
  6 => 401-8000000000000
  7 => 401-C000000000000
  8 => 402-0000000000000
  9 => 402-2000000000000
 10 => 402-4000000000000
 11 => 402-6000000000000
 12 => 402-8000000000000
 13 => 402-A000000000000
 14 => 402-C000000000000
 15 => 402-E000000000000
 16 => 403-0000000000000
  1 => 07F-000000
  2 => 080-000000
  3 => 080-400000
  4 => 081-000000
  5 => 081-200000
  6 => 081-400000
  7 => 081-600000
  8 => 082-000000
  9 => 082-100000
 10 => 082-200000
 11 => 082-300000
 12 => 082-400000
 13 => 082-500000
 14 => 082-600000
 15 => 082-700000
 16 => 083-000000
3FD-5555555555555
07D-2AAAAB

Давно для этого изобрели формат %a
http://www.cplusplus.com/reference/cstdio/printf/?kw=printf
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283704
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСдвигами лечится.

PS у тебя еще в double с мантиссой косяк, не 53, а 52
Ааа точно.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39283722
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... последний бит мантиссы немогу задействовать...

Код: plaintext
1.
2.
3.
4.
float  = 8388607.000000 	 raw = 0-10010101-11111111111111111111110 
float  = 8388608.000000 	 raw = 0-10010110-00000000000000000000000 
double = 4503599627370495.000000 	 raw = 0-10000110010-1111111111111111111111111111111111111111111111111110 
double = 4503599627370496.000000 	 raw = 0-10000110011-0000000000000000000000000000000000000000000000000000 
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285374
Dima 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 и т.д.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285380
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ну скажи пожалуйста зачем нужен такой тип данных который
нужно округлять после каждой операции с ним? А как
просядет нагрузка?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285402
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima T, ну скажи пожалуйста зачем нужен такой тип данных который
нужно округлять после каждой операции с ним? А как
просядет нагрузка?
Тоже об этом думаю. Надо округления сводить к минимуму, т.е. в конце расчета например. Фиг с ним с округлением, тормоза при сравнении важнее, а они тоже есть.

Тема не философская, мне надо для C# определиться в чем деньги хранить. Есть быстрый и компактный double и есть тормозной и неудобный decimal (хитрая 128 битная структура)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТоже об этом думаю. Надо округления сводить к минимуму, т.е. в конце расчета например. Фиг с ним с округлением, тормоза при сравнении важнее, а они тоже есть.

Я-бы не занимался округлением. А просто очертил-бы безопасные операции (присвоение целого). И проверил-бы
какие еще можно назвать такими.

Тема не философская, мне надо для C# определиться в чем деньги хранить. Есть быстрый и компактный double и есть тормозной и неудобный decimal (хитрая 128 битная структура)
Да и нечего думать. Ясен пень храни все в decimal. Деньги важны
и копейку терять нельзя.

А вот если тебе надо создать OLAP-кубики и быстро гонять по ним аналитику
то здесь double подходит идеально. Может даже и float -бы подошел.
Датамайнинг там... принятие решений. Туда-же.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285464
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T(хитрая 128 битная структура)
что там хитрого?


The binary representation of a Decimal number consists of a 1-bit sign, a 96-bit integer number, and a scaling factor used to divide the integer number and specify what portion of it is a decimal fraction. The scaling factor is implicitly the number 10, raised to an exponent ranging from 0 to 28.

The return value is a four-element array of 32-bit signed integers.

The first, second, and third elements of the returned array contain the low, middle, and high 32 bits of the 96-bit integer number.

The fourth element of the returned array contains the scale factor and sign. It consists of the following parts:

Bits 0 to 15, the lower word, are unused and must be zero.

Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.

Bits 24 to 30 are unused and must be zero.

Bit 31 contains the sign: 0 mean positive, and 1 means negative.

Note that the bit representation differentiates between negative and positive zero. These values are treated as being equal in all operations.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285523
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima 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;
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285548
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа и нечего думать. Ясен пень храни все в decimal. Деньги важны
и копейку терять нельзя.
Копейки все равно теряются - как ни крути. Округления никто не отменял т.к. учет идет с точностью до копейки. Есть дробные количества, разные методики расчета НДС и т.д. и т.п. Недавно прочитал что оказывается есть даже специальное банковское округление : округление происходит к ближайшему чётному, то есть 2,5 => 2, 3,5 => 4. Наверно в банках при регулярном начислении процентов эти копейки выливаются в круглую сумму.

C double проблемы видятся именно в сравнении, т.к. даже при больше/меньше есть проблемы. Например "цена < 100", а она записана с погрешностью как 99.99999999999 и все, попадет в выборку. Хотя можно написать "цена < 99.9999" но это ж помнить постоянно надо.

ХЗ почему MS похоронил тип money (64-битное целое со сдвигом на 4 разряда при выводе) и придумал этот decimal в C#. Int64 гораздо быстрее чем структура обрабатывается, т.к. нативный он для процов.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285566
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХЗ почему MS похоронил тип money (64-битное целое со сдвигом на 4 разряда при выводе) и придумал этот decimal в C#.
чтоб NUMERIC(n,m) от SQL сервера получить
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285574
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonДа и нечего думать. Ясен пень храни все в decimal. Деньги важны
и копейку терять нельзя.
Копейки все равно теряются - как ни крути.

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

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

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

плюс цены и количества могут иметь более 4-х знаков после запятой. короче тип не годный.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285602
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
банковское округление - почти случайный термин, оно настолько же банковское, насколько голландское, Гауссово или статистическое.
К счету денег именно как денег - непосредственного отношения не имеет .
Просто в IEEE 754 именно оно оказалось рекомендованным способом округления по умолчанию.
Потому библиотечные коды от Microsoft предпочитают его.
И да, в силу своих статистических свойств (оно дает несмещенную оценку среднего)
удобнее при вычислении баланса в тысячах .

Про деньги - другая история. И округление у денег - с приседом.
(Fixed point ариметика обладает "хорошими" свойствами по сложению, но на умножении
приезжают почти все те же истории.)
Пусть некий процесс счетом суммы по левой стороне дает
12.345,
а по правой - 12.34499999999999999999999999
Это - одно и то же число.
Только обычный "честный" Round(,2) для одного из них даст 12.35, а для другого - 12.34
При округлении в деньгах важно, чтобы в позиции, используемой для решения о том, куда округлять ( в данном случае в третьей) стояла точная цифра.
Этого можно добиться, только если предварительно провести округление до позиции дальше третьей.
+ исторически существовали (может и сейчас есть) деньги с тремя знаками после запятой.
Поэтому в денежном типе у Microsoft заявлено 4 знака.
Процедура приведения к этому типу гарантирует Round(,5) и все получившиеся 4 знака - точные. Теперь, наконец, уже в рамках этого типа, Round(,2) правомерен и дает правильный результат.
Т.е. если ты хочешь писать свой денежный тип, ты, так или иначе, должен повторить для него технику двойного округления.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285712
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Склоняюсь к мысли вести учет в копейках. int32 для цен, int64 для сумм. Как вариант может не экономить и int64 для цен тоже. Есть нагрузка из-за форматирования на входе-выходе, но тут надо потестить. У меня самодельные ToString()/FromString().
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285732
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
42 949 672 рублей 95 копеек в int?

Хватит-ли. Кроме того ограничения могут стрельнуть в другом месте
например если будет расчет арифметического среднего.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39285738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton42 949 672 рублей 95 копеек в int?

Хватит-ли. Кроме того ограничения могут стрельнуть в другом месте
например если будет расчет арифметического среднего.
В моем случае хватит, для цен сейчас хватает smallmoney в MSSQL т.е. максимум 214'748,3648 р., другое дело посчитать sum(price * kol) по большому количеству документов. Переход на копейки даст предел 21'474'836,48 что тоже немного, а int64 даст предел 92'233'720'368'547'758.08 что есть дофига.
...
Рейтинг: 0 / 0
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
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289005
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот для Китая к примеру распределение блоков:

https://www.countryipblocks.net/ipv6_cidr.php

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
2001:250:2000::/35
2001:250:4000::/34
2001:250:8000::/33
2001:250::/35
2001:251::/32
2001:252::/32
2001:254::/32
....


Если "/35" это маска
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289015
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВот для Китая к примеру распределение блоков:
Подумаешь, 16 млрд адресов назначили. Зато с гарантией. Ведь на каждый из адресов можно подключить практически неограниченное кол. отдельно адресуемых устройств.
Думаю, Китаю хватит надолго ))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289022
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я надеюсь года через 2-3 хватятся и внедрят нормальный Ivp5 с умеренным адресом.

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

ну наш Анатолей с тобой категорически не согласен, по его глубокоуважаемому .... мнению - там как раз все продумано.
а так да - это эпический просчет.

очень мощный.

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

а это сотни миллиардов долларов на переоборудовние только магистралей

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

на что провайдеры и операторы отреагировали очень просто - да просто забили болт на IPv6, типо когданибудь потом обновим железо, как помрет текущее от старости (а это с десяток лет минимум).
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289041
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Я надеюсь года через 2-3 хватятся и внедрят нормальный Ivp5 с умеренным адресом.
Хотя-бы из соображений экономии. Так ведь каждое маршрутизирующее устройство и каждый
хост неизбежно у себя резервирует какие-то кеши и временные хранилища для этих 128 бит.
Маршрутизируются только 64 бита. Структура этих 64 бит гораздо проще чем 32 в IPv4. Размер пакета меньше. Формат пакета специально оптимизирован для маршрутизаторов. Т.е. в IPv6 требования к маршрутизаторам снижены.
Поэтому ничего лучше вы не придумаете.

Единственная проблема IPv6 что он полностью создан с нуля. И весь код работавший с IPv4 не годится для него. Надо не только с нуля писать поддержку протокола, но и поддерживать одновременно обе версии.
Поэтому вендоры чей бизнес не зависит от Ipv6 забили на него, потому что инвестируют в прибыль а не в прикольные новинки.
А вовсе не потому что 128 бит слишком много ))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289049
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИ весь код работавший с IPv4 не годится для него. Надо не только с нуля писать поддержку протокола, но и поддерживать одновременно обе версии.
это не страшно.

беда в том, что туча провайдеров и маршрутизаторов у конечных пользователей понятия не имеют о v6
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289054
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилAnatoly MoskovskyИ весь код работавший с IPv4 не годится для него. Надо не только с нуля писать поддержку протокола, но и поддерживать одновременно обе версии.
это не страшно.

беда в том, что туча провайдеров и маршрутизаторов у конечных пользователей понятия не имеют о v6

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

что в принципе и объяснимо, 99% пользователей и даром не нужно работать с реальным/выделенным IP,
UDP hole вполне достаточно для P2P, а 32 бита IPv4 range, помноженные на 65к port range дают в принципе не ограниченные возможности адресации.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289056
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилбеда в том, что туча провайдеров и маршрутизаторов у конечных пользователей понятия не имеют о v6
Это не проблема протокола. Это происходит не потому что он неудачный, как тут профи пытаются втирать )))
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289061
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИзопропилбеда в том, что туча провайдеров и маршрутизаторов у конечных пользователей понятия не имеют о v6
Это не проблема протокола. Это происходит не потому что он неудачный, как тут профи пытаются втирать )))
с практической точки зрения он неудачный, потому что обратно несовместимый.
пример удачности - это UTF-8, ибо придуман гениями.

революции при миллиардах денег и единиц оборудоования внедрений уже не работают, только эволюционный подход.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289066
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕдинственная проблема IPv6 что он полностью создан с нуля. И весь код работавший с IPv4 не годится для него. Надо не только с нуля писать поддержку протокола, но и поддерживать одновременно обе версии.
Поэтому вендоры чей бизнес не зависит от Ipv6 забили на него, потому что инвестируют в прибыль а не в прикольные новинки.
А вовсе не потому что 128 бит слишком много ))
Я с вами согласен. Мы можем просто разойтись в цифрах. Вы считаете что вендоры и частный бизнес
забили на него а я знаю что Internet of things развивается и ни я ни вы не можем посчитать
сколько этим "вещам" нужно будет адресного пространства черз 2,4,8 лет.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289071
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAnatoly MoskovskyЕдинственная проблема IPv6 что он полностью создан с нуля. И весь код работавший с IPv4 не годится для него. Надо не только с нуля писать поддержку протокола, но и поддерживать одновременно обе версии.
Поэтому вендоры чей бизнес не зависит от Ipv6 забили на него, потому что инвестируют в прибыль а не в прикольные новинки.
А вовсе не потому что 128 бит слишком много ))
Я с вами согласен. Мы можем просто разойтись в цифрах. Вы считаете что вендоры и частный бизнес
забили на него а я знаю что Internet of things развивается и ни я ни вы не можем посчитать
сколько этим "вещам" нужно будет адресного пространства черз 2,4,8 лет.

твоему холодильнику не нужен выделенный IP, тебя обманули :)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289084
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaтвоему холодильнику не нужен выделенный IP, тебя обманули :)
У меня тоже скепсис по поводу холодильника. Но для того чтобы коммуницировать умные часы,
планшет, ТВ-панель - все равно нужна какая-то адресация. И это не NAT.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289085
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaтвоему холодильнику не нужен выделенный IP, тебя обманули :)
да, достаточно динамического и за NAT
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289088
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton Internet of things развивается и ни я ни вы не можем посчитать
сколько этим "вещам" нужно будет адресного пространства черз 2,4,8 лет.
Вот когда инвесторы это посчитают - тогда и внедрят ))
По факту у конечных юзеров уже есть полная поддержка IPv6.
Осталось чтобы их ISP нашли в этом выгоду и вложились в апгрейд.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289091
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня тоже скепсис по поводу холодильника.
А я бы не отказался знать что есть в холодильнике стоя у полки в магазине.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289108
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskymayton Internet of things развивается и ни я ни вы не можем посчитать
сколько этим "вещам" нужно будет адресного пространства черз 2,4,8 лет.
Вот когда инвесторы это посчитают - тогда и внедрят ))
По факту у конечных юзеров уже есть полная поддержка IPv6.
Осталось чтобы их ISP нашли в этом выгоду и вложились в апгрейд.

по какому еще такому факту, господи?

если IPv6 стоит в винде, и он даже не выключен - это вовсе не значит, что WiFi SOHO раутер у пользователя в принципе понимает IPv6.

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

для этого есть жена и OneNote/Evernote, которые синхронизируются с холодильником в режиме "купить сегодня".

достаточно завести список продуктов, которые обычно покупаются (не более 200), и отмечать крыжиком - пустые крыжики - купить, зачеканные - покупать сегодня не надо.
жена тебе отмечает что купить, ты покупаешь - и сразу отмечаешь "куплено", как только забрасываешь в корзинку.

internet of things, да да
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289123
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaэто вовсе не значит, что WiFi SOHO раутер у пользователя в принципе понимает IPv6.

Скорее всего не понимает вообще (привет длинк).
и провайдеры с хостингами впридачу.
в принтерах и камерах - далеко не всегда ipv6 есть


так что остаётся локальная сетка, а в ней - 10.0.0.0 ( кому недостаточно - вполне могут внутри себя держать всё оборудование с поддержкой v6)
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289126
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилnojavaэто вовсе не значит, что WiFi SOHO раутер у пользователя в принципе понимает IPv6.

Скорее всего не понимает вообще (привет длинк).
и провайдеры с хостингами впридачу.
в принтерах и камерах - далеко не всегда ipv6 есть


так что остаётся локальная сетка, а в ней - 10.0.0.0 ( кому недостаточно - вполне могут внутри себя держать всё оборудование с поддержкой v6)

для локальной домашней сетки вполне достаточно 192.168.1.0/24

в 99% случаев даже на /24 еще 95% свободных адресов болтается.
у особо упоротых (вроде меня) всего навсего 48- fake IP ников в статике, ну и гостевых 16 (их них максимум заюзанных одновременно - 7).
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaжена тебе отмечает что купить, ты покупаешь - и сразу отмечаешь "куплено", как только забрасываешь в корзинку.
Зачем жену напрягать тупой работой, и самому напрягаться, если с ней "умный" холодильник может справиться?
Забил один раз список продуктов обязательного наличия, в магазине кнопку нажал и получил список того что там закончилось и что есть. Как-то так я себе представляю "умный" холодильник.
Если введут маркировку продуктов какими-нибудь метками машиночитаемыми, то вполне реально такое реализовать.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289133
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaтвоему холодильнику не нужен выделенный IP, тебя обманули :)
У меня тоже скепсис по поводу холодильника. Но для того чтобы коммуницировать умные часы,
планшет, ТВ-панель - все равно нужна какая-то адресация. И это не NAT.

и?

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

реальный IP вам там не нужен вообще
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289149
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Личные вопросы давайте отложим.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289157
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaреальный IP вам там не нужен вообще
Я сам часто думаю над этим вопросом. Возможно проблемы Ipv4 адресации и не существует.
Благо уровней виртуализации над Ipv4 - полная коробочка.

Но мне хотелось-бы обходится без Nat, VPN, Тунелей, Проксей разных левлов,
и прочих торов с торентами. Есть sourceIp на планете Земля и destIp + port на
планете Марс. And I will be happy...
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289190
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonnojavaреальный IP вам там не нужен вообще
Я сам часто думаю над этим вопросом. Возможно проблемы Ipv4 адресации и не существует.
Благо уровней виртуализации над Ipv4 - полная коробочка.

Но мне хотелось-бы обходится без Nat, VPN, Тунелей, Проксей разных левлов,
и прочих торов с торентами. Есть sourceIp на планете Земля и destIp + port на
планете Марс. And I will be happy...

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

а если позволить всем пинговать всех, то никто firewall ставить не будет - лень, лишнее движение.

в текущей ситуации мне кажется что IPv4 будет с нами еще не один десяток лет.
хостинги сильно подвинутся (вон даже для всего фейсбука достаточно всего одного IP),
пользователи всегда поприжмутся со своим неоправданным "требованием" реального IP (такое нужно только гикам, обычным людям до лампочки совершенно).

а на магистральном уровне всегда возможно туннелирование и инкапсулирование (что сейчас происходит уже).
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289209
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а какие недостатки у Nat. Я навскидку щас пытаюсь вспомнить и припомнил только одно.
За Nat невозможно поднять два листенера на 80 порту.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289219
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот когда инвесторы это посчитают - тогда и внедрят ))
+1
Точнее когда появится какой-то ширпотребный софт/технология удобнее работающая по IPv6, чем с костылями над IPv4. ИМХУ главный плюс IPv6 в "белых" IP, т.е. в возможности установить соединение между любыми поинтами сети.
Но намеков на такую потребность не видно на горизонте. На горизонте пока обратное, "облака", а тут нет проблем с IPv4, т.к. "белые" IP надо только серверам, а количество НАТов, за которыми сидит клиент, проблем не создает.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289223
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу а какие недостатки у Nat. Я навскидку щас пытаюсь вспомнить и припомнил только одно.
За Nat невозможно поднять два листенера на 80 порту.
эта задача вполне по плечу реверспрокси на маршрутизаторе
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289276
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗа Nat невозможно поднять два листенера на 80 порту.Для этого (уже давно) придуман name based vhost и reverse proxy .
И придумано всё это не потому, что NAT.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289279
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил, Basil A. Sidorov, то что вы предлагаете это перемешивание уровня приложения и транспорта, на уровне только транспорта задача нерешаема.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289283
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tто что вы предлагаете это перемешивание уровня приложения и транспорта
Сколько уровней в семиуровневой модели взаимодействия открытых систем ISO?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289284
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima Tто что вы предлагаете это перемешивание уровня приложения и транспорта
Сколько уровней в семиуровневой модели взаимодействия открытых систем ISO?
Тест на дебилизм решил устроить? Давай двумя уровнями обойдемся: транспорт и приложение. http это уровень приложения.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289285
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИзопропил, Basil A. Sidorov, то что вы предлагаете это перемешивание уровня приложения и транспорта, на уровне только транспорта задача нерешаема.Если не впихивать в транспорт невпихумемое, то мухи начинают отделяться от котлет.
Реверс-прокси решают не только дурацкую задачу "повесить два приложения на один порт на одном интерфейсе" и нужен даже тогда, когда у вас вообще нет NAT-а.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289286
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Thttp это уровень приложения.HTTP это транспортный протокол. Что, собственно и закодировано в его аббревиатуре.
Уровень приложения - обработчики методов HTTP-запросов.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289292
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima Thttp это уровень приложения.HTTP это транспортный протокол. Что, собственно и закодировано в его аббревиатуре.
Уровень приложения - обработчики методов HTTP-запросов.
Хорошо. На порту 80 не обязан висеть web-сервер. Пусть даже он там висит, возьмем порт 12345, где висит самопальный сервис с собственным протоколом обмена, где никак не упомянуто к кому обращение... В общем я к тому что reverse proxy это один из костылей IPv4, он работает, его используют, но это фундаментальное нарушение модели OSI, где заявлено независимость уровней друг от друга. Вобщем грязный хак.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289293
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tно это фундаментальное нарушение модели OS
ICMP является первым "нарушителем"
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289294
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВ общем я к тому что reverse proxy это один из костылей IPv4Есть ложь, наглая ложь и добросовестное заблуждение.
Во-первых: реверс-прокси - специфика, обусловленная чётким синтаксисом HTTP-запросов, позволяющим не лезть в семантику.
Во-вторых: реверс-прокси не является спецификой IPv4.
Он (прокси) вообще не зависит от того, поверх чего работает HTTP: сделаете HTTP-over-serial - и там ему найдётся (полезное) применение.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289296
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovсделаете HTTP-over-serial
пример искуственный, в вот поверх доменых сокетов/именованых каналов - к реальности ближе
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289297
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилповерх доменых сокетов/именованых каналов - к реальности ближеГораздо ближе - IPv6, поскольку причина использования "именованных" виртуальных хостов и обратных прокси никак не связана с дефицитом адресов
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289298
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tно это фундаментальное нарушение модели OSI, где заявлено независимость уровней друг от друга

практика - критерий истины, оставьте комитетчиков в покое, они за свою писанину зарплату получают
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕсть ложь, наглая ложь и добросовестное заблуждение.
"Статистика" никак не упомянута, а просится. ИМХУ всем просто фиолетово на уровни OSI и вообще на философию OSI, поэтому транспорт смотрит во внутря чего доставляет, что изначально было табу в теории OSI.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289301
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИМХУ всем просто фиолетово на уровни OSI и вообще на философию OSI, поэтому транспорт смотрит во внутря чего доставляет, что изначально было табу в теории OSI.То, что OSI-модель проиграла IP-модели никак не отменяет того факта, что HTTP - транспортный протокол с чётким синтаксисом, который позволяет ограничиться разбором (только) структурированных заголовков для "всяческой магии".
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289304
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDima TИМХУ всем просто фиолетово на уровни OSI и вообще на философию OSI, поэтому транспорт смотрит во внутря чего доставляет, что изначально было табу в теории OSI.То, что OSI-модель проиграла IP-модели никак не отменяет того факта, что HTTP - транспортный протокол с чётким синтаксисом, который позволяет ограничиться разбором (только) структурированных заголовков для "всяческой магии".
Полностью согласен.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289307
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tчересчур умные теоретики, слишком сложно придумали
они не сложно придумали - жизнь разнообразнее оказалась.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289310
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima Tчересчур умные теоретики, слишком сложно придумали
они не сложно придумали - жизнь разнообразнее оказалась.
Жизнь всегда разнообразнее, но есть разница между официально разрешить стрелять в ногу, и признавать что есть частные случаи выстрелов в ногу. Т.е. либо забиваем на теорию, либо не принимаем/замечаем ее нарушителей.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289319
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ISO-OSI не просто теория, это мертворождённый монстр.
А вот RFC - набор практик разной степени практичности
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289651
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBasil A. Sidorovпропущено...
HTTP это транспортный протокол. Что, собственно и закодировано в его аббревиатуре.
Уровень приложения - обработчики методов HTTP-запросов.
Хорошо. На порту 80 не обязан висеть web-сервер. Пусть даже он там висит, возьмем порт 12345, где висит самопальный сервис с собственным протоколом обмена, где никак не упомянуто к кому обращение... В общем я к тому что reverse proxy это один из костылей IPv4, он работает, его используют, но это фундаментальное нарушение модели OSI, где заявлено независимость уровней друг от друга. Вобщем грязный хак.

детский сад какой-то, господи.
необходимость reverse proxy это никакие не хаки, и не IPv4 костыли.

он нужен просто потому что

а) OpenSSL страшно дыряв, и его нужно изолировать от бекэнда. Бекэнд вообще ничего не должен знать про SSL
б) балансировать нагрузку как-то надо, выставлять в интернет целую кучу IP адресов напрямую - это клиника, кто между ними переключение будет делать при перегрузке?
в) отказоустойчивость обеспечивать тоже надо - кто еще, как не reverse прокци будет делать HA переключение, при помирании одной из нод бекэнда?
г) проблема медленных каналов у клиентов (3g, edge, v.42bis, гг) - зачем бекэнду (апач, с кучей памяти под PHP и т.п.) сидеть тратить время, ждать, пока клиент там выгребет свою порцию данных? бекэнд отдал фронтэнду ответ и пошел другого клиента обрабатывать, а прокси-фронтэнд с минимальными ресурсами (ему даже стек не нужен под каждый коннект) уже озаботится как
доставить ответ клиенту
д) gzip - тоже не дело бекэнда, как и поддержка этих ващих SPDY, HTTP 2.0 - весь этот треш даром не нужен на бекэнде (апаче)

дальше продолжать лениво

эти же правила останутся в силе и для IPv6, ничего не изменится.

при чем тут вообще IPv4?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289660
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaпри чем тут вообще IPv4?
Разговор был про IPv4 vs IPv6, а HTTP просто частный случай их использования.
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289670
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРазговор был про IPv4 vs IPv6, а HTTP просто частный случай их использования.
а что в этом мире кроме HTTP и RTP нужно?
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39289682
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила что в этом мире кроме HTTP и RTP нужно?
Да и RTP под вопросом. Вся медия в последние годы переводится на HTTP
...
Рейтинг: 0 / 0
inline extern из библиотеки, как правильно декларировать-имплементировать?
    #39431750
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojavaпри этом даже гуру C++ прямо говорят - идея, что давайте все раскопипастим, а компилятор все это чудесно заоптимизирвет - оказалась пшиком, никакого прироста производительности никто так и не смог достичь, зато исполнимый код бухнет, вымывая L2/L3 кеши просто на ура.Не пшик, реально есть такая оптимизация. В Visual C++ она называется «identical comdat folding» (ICF) и реализована уже давно, в Visual C++ 6 точно есть. Например, есть программа:
test_icf.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
extern "C" void test_parts();
extern "C" void test_roots();

int main() {
  test_parts();
  test_roots();
  return 0;
}

parts.cpp
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <assert.h>
#include <stdio.h>

struct part_t;

// список частей
struct parts_t {
  part_t* first;
  part_t* last;
};

struct part_t {
  part_t* prev;
  part_t* next;
  int id;
};

// добавляет часть в список
extern "C" void add_part(parts_t* parts, part_t* part) {
  part_t* last = parts->last;
  part->prev = last;
  part->next = NULL;
  if (last != NULL) {
    assert(last->next == NULL);
    last->next = part;
  } else {
    assert(parts->first == NULL);
    parts->first = part;
  }
  parts->last = part;
}

extern "C" void test_parts() {
  parts_t parts = {NULL, NULL};
  part_t p1; p1.id = 1; add_part(&parts, &p1);
  part_t p2; p2.id = 2; add_part(&parts, &p2);
  part_t p3; p3.id = 3; add_part(&parts, &p3);

  printf("parts:\n");
  for (part_t* p = parts.first; p != NULL; p = p->next) {
    printf("%i\n", p->id);
  }
}

roots.cpp
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include <assert.h>
#include <stdio.h>

struct root_t;

// список корней
struct roots_t {
  root_t* first;
  root_t* last;
};

struct root_t {
  root_t* prev;
  root_t* next;
  double value;
};

// добавляет корень в список
extern "C" void add_root(roots_t* roots, root_t* root) {
  root_t* last = roots->last;
  root->prev = last;
  root->next = NULL;
  if (last != NULL) {
    assert(last->next == NULL);
    last->next = root;
  } else {
    assert(roots->first == NULL);
    roots->first = root;
  }
  roots->last = root;
}

extern "C" void test_roots() {
  roots_t roots = {NULL, NULL};
  root_t r1; r1.value = 1; add_root(&roots, &r1);
  root_t r2; r2.value = 2; add_root(&roots, &r2);
  root_t r3; r3.value = 3; add_root(&roots, &r3);

  printf("roots:\n");
  for (root_t* r = roots.first; r != NULL; r = r->next) {
    printf("%f\n", r->value);
  }
}

«extern "C"» использовал, чтобы link-овочные имена были читабельные, без mangling-а. Смотрим сгенерированный map-файл (конфигурация Release):
test_icf.map
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 ...
  Address         Publics by Value              Rva+Base     Lib:Object

 0001:00000000       _test_parts                00401000 f   parts.obj
 0001:00000090       _add_root                  00401090 f   roots.obj
 0001:00000090       _add_part                  00401090 f   roots.obj
 0001:000000c0       _test_roots                004010c0 f   roots.obj
 0001:00000170       _main                      00401170 f   test_icf.obj
 ...
 0001:00000305       _fast_error_exit           00401305 f   LIBC:crt0.obj

 48 bytes saved through ICF

Функции add_part и add_root компилируются в одинаковый машинный код, поэтому linker разместил их в одном месте. Тут ещё наверняка важно, что нигде в C++-коде не берётся адрес этих функций, а значит не требуется идентичность (уникальность адреса).

Скорее всего, эта оптимизация была сделана из-за шаблонов. Функции std::list<part_t*>::push_back и std::list<root_t*>::push_back компилируются в одинаковый машинный код, а их адрес обычно не берут.

Тут правда есть одна тонкость. Если операционная система пишет что-нибудь типа «случился crash по адресу 00401093», то вы не сможете узнать, в какой функции, в add_part или add_root. То же самое со stack trace, который строится по адресам функций.
...
Рейтинг: 0 / 0
276 сообщений из 276, показаны все 12 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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