@ProCxx

Страница 1219 из 2477
Ilia
17.08.2017
08:56:16
Владислав
17.08.2017
08:57:05
Никак. double, float — по своей сути неточные типы данных.
Я понимаю это, но наверняка какие-то решения здесь придуманы

Ilia
17.08.2017
08:57:16
Решения чего ?

Ты просто должен поглядеть на результат и понять его примерное значение. смысла округлять 6.499999... до 6.5 нет

Google
Владислав
17.08.2017
08:58:46
Я же не сам округляю, а std::round

Ilia
17.08.2017
08:59:14
Нет смысла вообще округлять

Владислав
17.08.2017
09:00:03
в смысле?

Ilia
17.08.2017
09:01:21
Есть некий дабл, есть некий процент, нужно взять процент от дабла и округлить полученное значение. Например double = 10.0, процент = 65%, берём 65% от 10, ожидаем получить 6.5, но на практике получаем 6.4999999, из-за чего округление неправильно работает, как в общем случае такие ситуации обрабатывать? — НЕТ СМЫСЛА ОКРУГЛЯТЬ ВООБЩЕ

Тебе нужно взять 65%, бери значение, и домножай на 0.65 и печатай. Всё.

Владислав
17.08.2017
09:02:57
Не понимаю, зачем мне его печатать? Мне это значение нужно для следующих вычислений.

Ilia
17.08.2017
09:03:01
"нужно гарантировать правильное вычисление значения. То есть как мне добиться того, что первый знак после запятой гарантировано верный?" — значение и так правильное. Тебе не нужно ничего гарантировать.

Ну, тогда используй его для следующих вычислений. Без округлений.

Владислав
17.08.2017
09:04:00
Мне нужно именно округлённое значение

Ilia
17.08.2017
09:04:23
До чего округлённое ?

Владислав
17.08.2017
09:04:35
до целого

Ilia
17.08.2017
09:04:39
Что ты считаешь в конечном итоге ?

Antony
17.08.2017
09:05:54
Мне нужно именно округлённое значение
А как выглядит задача целиком? Что надо делать с дальнейшим числом? Дайте больше контекста. Возможно что нужно использовать decimal, либо совершенно по другому подходить к вычислениям

Google
Владислав
17.08.2017
09:06:17
Ок, сейчас опишу контекст

Ilia
17.08.2017
09:06:19
до целого
Ну ок, http://www.cplusplus.com/reference/cmath/round/?kw=round

Eugene
17.08.2017
09:06:29
до целого
> 10.0, процент = 65%, берём 65% от 10, ожидаем получить 6.5, но на практике получаем 6.4999999, из-за чего округление Что ты считаешь "целым"?

Существует стандарт IEEE 754, там есть 5 методов округления. https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules

Александр
17.08.2017
09:09:21
Владислав
17.08.2017
09:10:27
А как выглядит задача целиком? Что надо делать с дальнейшим числом? Дайте больше контекста. Возможно что нужно использовать decimal, либо совершенно по другому подходить к вычислениям
Контекст такой: мне приходить две цены double price1, double price2 вычисляю дифф между ценами следующим образом double diff = std::fabs(normalize_double(price1, 5) - normalize_double(price2, 5)) * std::pow(10,5); этот дифф множится на процент diff = std::round(diff * 0.65); добавляется в конечную цену. result price += diff / std::pow(10, 5);

Александр
17.08.2017
09:11:06
» std::pow(10, 5); ужас

Владислав
17.08.2017
09:11:31
почему?

Ilia
17.08.2017
09:14:36
(int)value;
int( std::round( value ) );

Александр
17.08.2017
09:14:47
почему?
это же константа, причём нормальная, а не 197491238

Владислав
17.08.2017
09:15:26
это же константа, причём нормальная, а не 197491238
это в приведёном куске константа, а не в коде

я не стал вводить в пример ненужные сущности

Александр
17.08.2017
09:15:58
это в приведёном куске константа, а не в коде
если в коде переменные, то ладно

Eugene
17.08.2017
09:16:23
Могу предложить способ округления до n-знаков после запятой, который используется в Python. https://github.com/python/cpython/blob/master/Objects/floatobject.c#L987 Либо используй decimal-like решения, если тебе действительно нужно контролировать точность дробной части.

Antony
17.08.2017
09:16:55
Контекст такой: мне приходить две цены double price1, double price2 вычисляю дифф между ценами следующим образом double diff = std::fabs(normalize_double(price1, 5) - normalize_double(price2, 5)) * std::pow(10,5); этот дифф множится на процент diff = std::round(diff * 0.65); добавляется в конечную цену. result price += diff / std::pow(10, 5);
Округляйте только на последнем этапе, уменьшите количество операций с double: double diff = std::fabs(price1 - price2); diff = diff * 0.65; price += diff; return std::round(price); А правильным решением будет использовать decimal

Владислав
17.08.2017
09:18:10
» А правильным решением будет использовать decimal ну там всё приложение на даблах :)

Владислав
17.08.2017
09:18:55
это торги на форексе

Google
Ilia
17.08.2017
09:20:06
Ну ок, а это значение используется для точного вычисления некоей величины, скажем, маржи, или для оценки какой-то целесообразности чего-то ?

Antony
17.08.2017
09:20:16
это торги на форексе
> ну там всё приложение на даблах :)

Ilia
17.08.2017
09:20:31
Ilia
17.08.2017
09:21:32
Не, может быть это и допустимо, если скажем это какой-то целевой показатель вычисляется, и по нему потом строется решение — допустимо делать в double

Владислав
17.08.2017
09:21:35
> ну там всё приложение на даблах :)
ну, вопросы к metaquotes, они такую апи к своему серверу предоставляют

Eugene
17.08.2017
09:22:07
В финансовых приложениях как раз используется decimal. Это как раз, чтобы контролировать точность до копейки.

Ilia
17.08.2017
09:22:21
мой кусок кода вычисляет цены открытия и закрытия для ордеров
Это тогда вряд ли можно делать используя типы с плавующей точкой. Читай ту статью на хабре.

Ilia
17.08.2017
09:23:28
В финансовых приложениях как раз используется decimal. Это как раз, чтобы контролировать точность до копейки.
Не в финансовых, а в бухгалтерских. Как раз в финансовых плаваяющая точка вполне допустима — им не нуно, чтобы финплан на год сходился до рубля с реальным расходом.

Владислав
17.08.2017
09:24:14
ну в смысле, мне приходят данные напрямую с сервера.

тебе код апишки скинуть?) это NDA :)

Antony
17.08.2017
09:24:46
Я всё чаще убеждаюсь, что самое безобразное ПО в банках и комерческих системах, работающих с деньгами

Ilia
17.08.2017
09:24:49
Непубличный ?

Eugene
17.08.2017
09:25:03
тебе код апишки скинуть?) это NDA :)
Чтоа? У метатрейдер открытый API

Ilia
17.08.2017
09:25:14
тебе код апишки скинуть?) это NDA :)
Описание API есть публичное ?

Владислав
17.08.2017
09:25:40
ну вот как пример, структура, хранящая тики из их апи struct TickAPI { time_t ctm; // time double bid,ask; // normalized bid & ask };

Google
Ilia
17.08.2017
09:26:15
Нет, ты давай ссылку на ИХ описание ИХ API, а не какие-то структуры.

Владислав
17.08.2017
09:27:28
Чтоа? У метатрейдер открытый API
он же с платформой предоставляется

к докам тоже доступ закрытый

Ilia
17.08.2017
09:28:34
Я просто тоже как бы на бирже работаю — у нас всё в decimal.... Reuters тоже помню обрабатывали — та же хрень... Так что пока не верю.

Eugene
17.08.2017
09:28:57
к докам тоже доступ закрытый
Я не понимаю. Я когда-то что-то делал на языке в метатрейдер (MQL вроде), всё было открыто, куча примеров и т.п. Что за закрытая платформа?

Ilia
17.08.2017
09:29:49
Ну, тогда у тебя выбор — на входе преобразовывать всё в что-то типа decimal, считать нормально, на выходе — преобразовывать обратно. Либо считать всё в Double но тогда уже не жаловаться на погрешности расчётов, учитывать их при работе.

Владислав
17.08.2017
09:31:18
metatrader 4. Mql открыт, это для разработки советников различных. Я занимаюсь разработкой плагинов под их платформу, доки закрыты у них.

Admin
ERROR: S client not available

Eugene
17.08.2017
09:37:13
metatrader 4. Mql открыт, это для разработки советников различных. Я занимаюсь разработкой плагинов под их платформу, доки закрыты у них.
Понятно. Тогда спроси их разработчиков (если они тебе доступ к api открыли), как контролировать точность в рамках их платформы. В качестве оффтопа, личное мнение: форекс - фу. Не порть карму :)

Владислав
17.08.2017
09:38:39
мне теперь в оупенсорс круглосуточно нужно коммитить, чтоб карму отмыть :)

Anton
17.08.2017
10:03:23
С++ самый крутой язык программирования

Ioann V
17.08.2017
10:05:03
А чего случилось то :?
Или это не тот Бэйби Ту Найт :?

Владислав
17.08.2017
10:09:12
А чего случилось то :?
Не понял вопроса

Ioann V
17.08.2017
10:09:38
Ну тут в чате есть еще один, с рысью на автарке.

Владислав
17.08.2017
10:09:45
это я

Ioann V
17.08.2017
10:09:57
Тогда ясно ;)

Владислав
17.08.2017
10:10:33
это не рысь была, а каракал

Andrei
17.08.2017
10:33:44
Хранить цену в double? Мощно.

Google
Владислав
17.08.2017
10:41:28
это очень больно, согласен

Danylo
17.08.2017
10:59:08
я думал, их вообще безопаснее в интах хранить

Andrei
17.08.2017
11:00:50
Безопаснее их хранить в спец. типах, чтобы тебе еще компилятор проверку типов энфорсил.

Александр
17.08.2017
11:21:24
и переполнения разные

Evgeniy
17.08.2017
11:24:42
и переполнения разные
если у меня будет переполнение типа в котором я записываю деньги, то можно будет забить на разработку)

Влад
17.08.2017
11:27:32
а так должно быть, что лямбды запускается раньше, чем они вызываются?

Александр
17.08.2017
11:27:52
нет

Влад
17.08.2017
11:28:23
пример: auto func = [some_var] () { some code }; func();

не дойдя до func выполнится.

Владислав
17.08.2017
11:29:31
эм, а пример рабочий можно?

Влад
17.08.2017
11:29:41
тут очень большой код.

мне нужно весь код было поместить в одну функцию.

и я все методы поместил по лямбдам.

Владислав
17.08.2017
11:30:45
ну напиши минимально рабочий пример

где твой кейс воспроизводится

Влад
17.08.2017
11:33:07
rebuild помог

странный этот кьют.

Tema
17.08.2017
11:38:46
rebuild помог
не используеш ide = не тратиш кучу времени на решение неведомых проблем которые создаёт ide

Страница 1219 из 2477