Re[7]: использование round
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.02.18 22:57
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>У Страуструпа в старом издании начала века в приложении B.6.2.6 о преобразовании плавающих в целые


TB>Ну если так, то что будет для отрицательных чисел?


Будет отброшена дробная часть, не?
Маньяк Робокряк колесит по городу
Re[2]: использование round
От: VladFein США  
Дата: 16.02.18 02:01
Оценка:
Здравствуйте, rg45, Вы писали:

R>... Поэтому явный каст к нужному типу вполне приемлем, я считаю:


R>
R>int value = int(std::round(3.14f));
R>


Это разве каст?
Re[3]: использование round
От: rg45 СССР  
Дата: 16.02.18 08:48
Оценка: 12 (1)
Здравствуйте, VladFein, Вы писали:

R>>
R>>int value = int(std::round(3.14f));
R>>


VF>Это разве каст?


Конечно. Такие выражения игогда назвают "function-style conversions" и они эквивалентны "cast expressions": (int)std::round(3.14f). Вот что сказано по этому поводу в стандарте (C++17):

8.2.3 Explicit type conversion (functional notation)
2 If the initializer is a parenthesized single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (8.4)...


И вот еще цитата из 8.4:

8.4 Explicit type conversion (cast notation)
2 An explicit type conversion can be expressed using functional notation (8.2.3), a type conversion operator (dynamic_cast, static_cast, reinterpret_cast, const_cast), or the cast notation.

    cast-expression:
        unary-expression
            ( type-id ) cast-expression

--
Отредактировано 16.02.2018 9:19 rg45 . Предыдущая версия . Еще …
Отредактировано 16.02.2018 9:12 rg45 . Предыдущая версия .
Re[8]: использование round
От: rg45 СССР  
Дата: 16.02.18 08:59
Оценка:
Здравствуйте, Marty, Вы писали:

M>>
M>>double d = 5.5;
M>>int i = (int)(d+0.5);
M>>


TB>>Ну если так, то что будет для отрицательных чисел?


M>Будет отброшена дробная часть, не?


Тут тебе придется с ним согласиться — твой вариант для отрицательных чисел будет работать не так как это ожидается от арифметического округления. Например, если мы захотм округлить -2.1, то получим: -2.1 -> -1.6 -> -1. Чтобы работало как надо, нужно слегка допилить:

int i = (int)(d < 0 ? d - 0.5 : d + 0.5);
--
Отредактировано 16.02.2018 8:59 rg45 . Предыдущая версия .
Re[9]: использование round
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.02.18 17:01
Оценка:
Здравствуйте, rg45, Вы писали:


R>Тут тебе придется с ним согласиться — твой вариант для отрицательных чисел будет работать не так как это ожидается от арифметического округления. Например, если мы захотм округлить -2.1, то получим: -2.1 -> -1.6 -> -1. Чтобы работало как надо, нужно слегка допилить:


R>
R>int i = (int)(d < 0 ? d - 0.5 : d + 0.5);
R>


Кто-то моё сообщение не дочитал

>для отрицательных надо отнять, если хочешь округление к большему по модулю
Маньяк Робокряк колесит по городу
Re[10]: использование round
От: rg45 СССР  
Дата: 16.02.18 17:03
Оценка:
Здравствуйте, Marty, Вы писали:


M>Кто-то моё сообщение не дочитал

>>для отрицательных надо отнять, если хочешь округление к большему по модулю

А да, есть такое дело. Виноват.
--
Re[8]: использование round
От: T4r4sB Россия  
Дата: 16.02.18 20:01
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, T4r4sB, Вы писали:


M>>>У Страуструпа в старом издании начала века в приложении B.6.2.6 о преобразовании плавающих в целые


TB>>Ну если так, то что будет для отрицательных чисел?


M>Будет отброшена дробная часть, не?


Ты сначала прибавил 0.5, потом кастанул к инту, что произошло?
Подсказка: проделай это с числом -3.14
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: использование round
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.02.18 20:40
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>>>Ну если так, то что будет для отрицательных чисел?


M>>Будет отброшена дробная часть, не?


TB>Ты сначала прибавил 0.5, потом кастанул к инту, что произошло?

TB>Подсказка: проделай это с числом -3.14

Тоже не любишь до конца дочитывать?

>для отрицательных надо отнять, если хочешь округление к большему по модулю
Маньяк Робокряк колесит по городу
Re[10]: использование round
От: T4r4sB Россия  
Дата: 16.02.18 21:10
Оценка:
Здравствуйте, Marty, Вы писали:

M>Тоже не любишь до конца дочитывать?


>>для отрицательных надо отнять, если хочешь округление к большему по модулю


Круто, теперь у тебя есть функция с хитрым ветвлением внутри.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[11]: использование round
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.02.18 21:12
Оценка:
Здравствуйте, T4r4sB, Вы писали:

>>>для отрицательных надо отнять, если хочешь округление к большему по модулю


TB>Круто, теперь у тебя есть функция с хитрым ветвлением внутри.


Чего тут хитрого?
Маньяк Робокряк колесит по городу
Re[12]: использование round
От: T4r4sB Россия  
Дата: 16.02.18 21:30
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, T4r4sB, Вы писали:


>>>>для отрицательных надо отнять, если хочешь округление к большему по модулю


TB>>Круто, теперь у тебя есть функция с хитрым ветвлением внутри.


M>Чего тут хитрого?


Может, надёжнее сделать ветвление после округления?
f += 0.5f;
int i = int(f);
if (i>f) --i;

такой код правильно работает независимо от того, куда округляет каст
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[13]: использование round
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 16.02.18 21:36
Оценка:
Здравствуйте, T4r4sB, Вы писали:


TB>такой код правильно работает независимо от того, куда округляет каст


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


ЗЫ Мой код (что-то типа inproc COM) работает под Win32 x86/64, Linux x86/64/Arm, и за него я вполне спокоен. Если что-то писать для embedded, то там могут быть нюансы, но там всё надо перепроверять в любом случае. Сейчас, кстати, под STM32 говнокодю
Маньяк Робокряк колесит по городу
Re[13]: использование round
От: rg45 СССР  
Дата: 16.02.18 21:50
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Может, надёжнее сделать ветвление после округления?

TB>
TB>f += 0.5f;
TB>int i = int(f);
TB>if (i>f) --i;
TB>

TB>такой код правильно работает независимо от того, куда округляет каст

Ну где ж правильно-то? 2.9 должно округлиться до 3, у тебя получается 2. -2.1 должно округлиться до -2, у тебя получается -3.
--
Отредактировано 16.02.2018 22:15 rg45 . Предыдущая версия .
Re[14]: использование round
От: T4r4sB Россия  
Дата: 16.02.18 21:56
Оценка: 10 (1)
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, T4r4sB, Вы писали:


TB>>Может, надёжнее сделать ветвление после округления?

TB>>
TB>>f += 0.5f;
TB>>int i = int(f);
TB>>if (i>f) --i;
TB>>

TB>>такой код правильно работает независимо от того, куда округляет каст

R>Ну где ж правильно-то? 2.9 должно округлиться до 3,

Да
R>у тебя получается 2.
Неправда
R>-2.1 должно округлиться до -2,
Да
R>у тебя получается -3.
Неправда
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[15]: использование round
От: rg45 СССР  
Дата: 16.02.18 22:14
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>Ну где ж правильно-то? 2.9 должно округлиться до 3,

TB>Да
R>>у тебя получается 2.
TB>Неправда
R>>-2.1 должно округлиться до -2,
TB>Да
R>>у тебя получается -3.
TB>Неправда

Да, все правильно, это я прогнал

Только чем это лучще? Вместо одного выражения: локальная переменная, условный оператор, модификация входного парамертра, дополнительное преобразование целого значения назад в число с плавающей точкой. В чем ты видишь выигрыш? Если это только ради того, чтоб подстраховаться на случай, если каст вдруг отработает не в ту сторону, то напрасно — как должен отработать каст прописано в стандарте языка.
--
Отредактировано 16.02.2018 22:59 rg45 . Предыдущая версия . Еще …
Отредактировано 16.02.2018 22:32 rg45 . Предыдущая версия .
Отредактировано 16.02.2018 22:21 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.