![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
миг |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 15.9.2008 Репутация: нет Всего: 1 |
![]()
--------------------
Oaks may fall when reeds stand the storm. |
||||
|
|||||
Anton86 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 13.12.2011 Репутация: нет Всего: нет |
Помогите разобраться с преобразованием типов. Есть код:
вывод программы: 1210 1211 1213 Насколько я представляю правила преобразования типов, при проведении промежуточных вычислений, при вычислении l0 - l2, сначала вычисляется значение в скобках типа float, затем результат преобразовывается к int. таким образом l должны быть l0=(int)(1211.0f)=1211, l1=(int)(1212.0f)=1212, l2=(int)(1213.0f)=1213. Объясните в чем дело. |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
в силу того что десятичные дроби, нельзя точно представить в float, здесь p0 = 121.099999... умножаем на 10, получаем: 1210.99999... ну а (int), просто берет целую чать, не округляя, т.е 1210. чтоб этого избежать, нужно округлять. Про округление, почитайте на предыдущей странице, там даже сторонние библиотеки предлагают... ![]() Простой (и имхо вполне нормальный) способ округления:
|
|||
|
||||
Anton86 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 13.12.2011 Репутация: нет Всего: нет |
спасибо за ответ. С округлением типа floor и fmod все ясно, интересуют именно промежуточные вычисления и преобразования типов при этом. Например, почему код
даст 1211? Это сообщение отредактировал(а) Anton86 - 14.12.2011, 19:51 |
|||
|
||||
volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Anton86, я же уже писал:
Все зависит от последнего значащего бита, а его вычисление зависит от реализации. Ваш код на одной платформе может дать 1210, на другой 1211 Это очень не надежный код
Вот этот код, гарантировано, на любой платформе даст 1211 |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |