tag:blogger.com,1999:blog-3940972473404160061.post3461194350214748787..comments2023-02-12T04:29:48.804-08:00Comments on Programming DIY / Программирование — это просто!: Можно ли memset'ить float и double?Александрhttp://www.blogger.com/profile/03980297457924475954noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-3940972473404160061.post-67291850189818290732010-04-19T03:41:46.269-07:002010-04-19T03:41:46.269-07:00float и double для аналитики вполне подходят. +/- ...float и double для аналитики вполне подходят. +/- два цента сути не меняют. Аналитика - это прогноз, он изначально неточен.<br />А вот в бухгалтерии все центы надо учитывать точно. В бухгалтерии даже сложный процент считают по "неправильной" формуле.<br />http://dxdy.ru/topic13064.htmlOleksandr Yefremovhttps://www.blogger.com/profile/12157032520300771308noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-79381304219600871662010-04-19T03:02:11.621-07:002010-04-19T03:02:11.621-07:00У нас именно аналитика. Там, где происходит исполн...У нас именно аналитика. Там, где происходит исполнение трейдов, часто применяет вообще символьное представление при передаче сумм туда сюда. Например, один из самых распространенных протоколов в мире finance - <a href="http://www.fixprotocol.org/" rel="nofollow">FIX</a>, вообще текстовый.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-34589784265575668872010-04-19T02:55:22.787-07:002010-04-19T02:55:22.787-07:00Этот комментарий был удален автором.Oleksandr Yefremovhttps://www.blogger.com/profile/12157032520300771308noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-47082571307096224442010-04-19T02:14:25.790-07:002010-04-19T02:14:25.790-07:00Все, сдаюсь! ;-)
Для финансовых операций, конечно...Все, сдаюсь! ;-)<br /><br />Для финансовых операций, конечно, надо самому фиксировать точку и понимать, как именно происходит использование дробной части. В банковской сфере так и делают.<br /><br />Скорее всего интерфейсы через float и double - это наследие Фортрана, на котором написана туча финансовой аналитики.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-62683616812804703702010-04-19T00:56:20.067-07:002010-04-19T00:56:20.067-07:00Другой пример
// we have 1 cent
double cent = 0.0...Другой пример<br /><br />// we have 1 cent<br />double cent = 0.01f;<br />// we can use fantastic multiply machine to <br />// reproduce it multiple tames<br />double lot_of_cents = cent * 100000000; <br />// lets put all big beg of our cents <br />// to the bank account<br />double account = lot_of_cents;<br />// we can estimate that we already have<br />// 1 million US on our account<br />double million = 1000000;<br />// lets try to use them<br />account -= million;<br />// now bank will check our account <br />// to be sure we are even one<br />double epsilon = 0.01; // too big epsilon !!!<br />if (account < -epsilon) <br /> std::cout << "You are bankrupt" << std::endl;<br /><br />// Ups !!! <br />// Don't use devices you are not sure about! <br />// double and float are not good <br />// for financial operations<br />std::cout << "Account = " << account << std::endl;Oleksandr Yefremovhttps://www.blogger.com/profile/12157032520300771308noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-90882224502709812642010-04-19T00:39:54.144-07:002010-04-19T00:39:54.144-07:00Использоване float и double для финансовых операци...Использоване float и double для финансовых операций неверно! Ни float, ни double не могут представить елементарные 10 сентов (0.1)<br /><br />пример:<br /><br />float cent = 0.01f;<br />if (cent < 0.01) <br /> std::cout << "cent < 0.01" << std::endl;<br />if (cent > 0.01) <br /> std::cout << "cent > 0.01" << std::endl;<br />if (cent == 0.01) <br /> std::cout << "cent == 0.01" << std::endl;<br /><br />Для большинства финансовых инструментов достаточно типов int или long long. При этом переменная должна хранить количество центов (или дробную часть центов в зависимости от нужной точности)<br /><br />Надеятся на атомарность действительных чисел - неправильно в принципе. И размер переменной тут непричём. Это уже оптимизация, а я очень сомневаюсь, что в конкретно вашем случае производительность была критической.Oleksandr Yefremovhttps://www.blogger.com/profile/12157032520300771308noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-46345702075525390072010-04-17T16:44:37.536-07:002010-04-17T16:44:37.536-07:00Хранение цены как float дает следующее:
- поддержк...Хранение цены как float дает следующее:<br />- поддержка дробности как таковой<br />- атомарность (float - это 4 байта, что на большинстве современных платформ атомарная единица), можно при многопотоковой обработке не использовать mutex'ы, "взятие" которых съедает все ухищрения по производительности. Атомарность double (8 байт) у нас на Sparc'ах не принимается. В double переводится только после критических по времени участков.<br /><br />Согласен, тут есть и плюсы и минусы. <br /><br />Кстати, от ошибок округления можно избавиться разве что хранением в натуральных дробях. Если у вас четко 4 знака после запятой в типе Currency, проблемы с округлением будут точно такие же.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-91097335163138858682010-04-17T03:16:41.398-07:002010-04-17T03:16:41.398-07:00@malgarr: согласен, даже double заставляет меня не...@malgarr: согласен, даже double заставляет меня нервничать. <br /><br />Я у себя использую тип Currency (хранится в 64-бит целом, фиксированная точка, 4 десятичных знака после запятой). Скорость сравнения для целых, мне кажется, даже пошустрее double будет.bialixhttps://www.blogger.com/profile/03276301722234350242noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-27394626950685139792010-04-17T03:14:08.244-07:002010-04-17T03:14:08.244-07:00А как решается проблема невозможности полностью то...А как решается проблема невозможности полностью точного представления десятичных дробей? Например, 0.3 это ж 0.2(9) даже в double. Всякие ошибки округления не мучают? Или у вас просто сравнение цен, без дальнейшей обработки их?bialixhttps://www.blogger.com/profile/03276301722234350242noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-69812137098485814802010-04-17T01:48:18.041-07:002010-04-17T01:48:18.041-07:00malgarr: А какие проблемы с хранением сумм с плава...<b>malgarr</b>: А какие проблемы с хранением сумм с плавающей точкой? разве что сравнивать надо не через "==", а через "abs(a-b) < e". Просто float и double - это просто и быстро. Правильнее, конечно, делать свой класс для чисел произвольной длины и точности, но если надо обрабатывать огромное количество сумм (например, цен) в секунду, то тут уже надо идти на компромисс.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-88225164601375982942010-04-17T01:44:27.389-07:002010-04-17T01:44:27.389-07:00bialix: нет, вот тут все четко: в С++ memset-ить м...<b>bialix</b>: нет, вот тут все четко: в С++ memset-ить можно только <a href="http://en.wikipedia.org/wiki/Plain_old_data_structure" rel="nofollow">POD</a> типы. Если в типе есть хоть минимальная примесь ООП, то нельзя делать никаких предположений о формате хранения типа в памяти, и тем более в эту память лазить руками. Например "struct A { int a; }" это POD-тип, а вот "struct A { public: int a; } - уже нет, хоть по сути одно и тоже.<br /><br />Конечно, во многих компиляторах будет работать memset для класса, но это не по страндарту.Александрhttps://www.blogger.com/profile/03980297457924475954noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-40408591688493694232010-04-16T23:15:23.069-07:002010-04-16T23:15:23.069-07:00деньги с плавающей точкой... Поубывалбыденьги с плавающей точкой... ПоубывалбыAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-63533984467874668352010-04-16T17:23:53.791-07:002010-04-16T17:23:53.791-07:00а классы memset-ить можно или нельзя?а классы memset-ить можно или нельзя?bialixhttps://www.blogger.com/profile/03276301722234350242noreply@blogger.comtag:blogger.com,1999:blog-3940972473404160061.post-35620593119675945682010-04-16T15:11:51.382-07:002010-04-16T15:11:51.382-07:00Я видел платформу, где binary representation для f...Я видел платформу, где binary representation для float и double была не в IEEE формате.<br /><br />"Нулевое" значение памяти для float'а соответствовало -1.0fQehgthttps://www.blogger.com/profile/13293619483296242978noreply@blogger.com