powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
25 сообщений из 276, страница 5 из 12
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
25 сообщений из 276, страница 5 из 12
Форумы / C++ [игнор отключен] [закрыт для гостей] / inline extern из библиотеки, как правильно декларировать-имплементировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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