Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование типа double в int 
V
    Опции темы
миг
Дата 25.2.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(jimbo @ 24.2.2011,  17:55)
я реализовал через строки. Но боже мой, какой тупизм!!

 smile 

Код

int fun(double x) 
{
   int y;
   y=x;
   if(x-(double)y>0.333333)y++;
   return y;
}

--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Anton86
Дата 13.12.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.12.2011

Репутация: нет
Всего: нет



Помогите разобраться с преобразованием типов. Есть код:

Код

 #include <iostream>

 using namespace std;

 int main()
 {
 float p0 = 121.1;
 float p1 = 121.2;
 float p2 = 121.3;
 int l0, l1, l2;

 l0 = (int)(p0 * 10.0);
 l1 = (int)(p1 * 10.0);
 l2 = (int)(p2 * 10.0);
 cout << l0 << endl << l1 << endl << l2 << endl;
 return 0;
 }


 вывод программы:

 1210
 1211
 1213

 Насколько я представляю правила преобразования типов, при проведении промежуточных вычислений, при вычислении l0 - l2, сначала вычисляется значение в скобках типа float, затем результат преобразовывается к int. таким образом l должны быть l0=(int)(1211.0f)=1211, l1=(int)(1212.0f)=1212, l2=(int)(1213.0f)=1213. Объясните в чем дело.
PM MAIL   Вверх
volatile
Дата 13.12.2011, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Anton86 @  13.12.2011,  19:29 Найти цитируемый пост)
 float p0 = 121.1;

в силу того что десятичные дроби, нельзя точно представить в float, здесь
p0 = 121.099999...
умножаем на 10, получаем:
1210.99999...
ну а (int), просто берет целую чать, не округляя, т.е 1210.
чтоб этого избежать, нужно округлять.
Про округление, почитайте на предыдущей странице, там даже сторонние библиотеки предлагают... smile 

Простой (и имхо вполне нормальный) способ округления:
Код

int res = (int) floor (float_value + .5);

PM MAIL   Вверх
Anton86
Дата 14.12.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.12.2011

Репутация: нет
Всего: нет



спасибо за ответ. С округлением типа floor и fmod все ясно, интересуют именно промежуточные вычисления и преобразования типов при этом. Например, почему код

Код
 
#include <iostream>

using namespace std;

int main()
{
    float p0 = 121.1;
    float p1;
    int l0;

    p1 = p0 * 10.0;
    l0 = (int)p1;
    
    cout << l0 << endl;

    return 0;
}


даст 1211?

Это сообщение отредактировал(а) Anton86 - 14.12.2011, 19:51
PM MAIL   Вверх
volatile
Дата 14.12.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Anton86, я же уже писал:
Цитата(volatile @  13.12.2011,  23:54 Найти цитируемый пост)
в силу того что десятичные дроби, нельзя точно представить в float

Все зависит от последнего значащего бита, а его вычисление зависит от реализации.
Ваш код на одной платформе может дать 1210, на другой 1211
Это очень не надежный код

Код

    float p0 = 121.1;
    float p1;
    int l0;

    p1 = p0 * 10.0;
    l0 = (int) floor (p1 + .5);
    cout << l0 << endl;


Вот этот код, гарантировано, на любой платформе даст 1211
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.