HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

float<->int
  #1  
Старый 23.09.2007, 20:19
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию float<->int

Нужно написать прогу на c++ которая переводила бы из float'а в int и наоборот.Дело в том что писать надо не так:
Код:
float a=5.8;
int b=(int)a;
А работать надо с побитовыми операциями,мантисами и прочей чушнёй.Подскажите алгоритм/идею как это сделать хотяюы
 
Ответить с цитированием

  #2  
Старый 23.09.2007, 20:45
VERte][
Участник форума
Регистрация: 17.05.2007
Сообщений: 220
С нами: 9992546

Репутация: 441
По умолчанию

b=static_cast<int>(a)
почему так как ты написал не подходит?

вообще общая формула приведения типов: x=static_cast<тип>(y)

Последний раз редактировалось Vertexe; 23.09.2007 в 20:53..
 
Ответить с цитированием

  #3  
Старый 23.09.2007, 20:56
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию

Цитата:
Сообщение от Vertexe  
b=static_cast<int>(a)
почему так как ты написал не подходит?

вообще общая формула приведения типов: x=static_cast<тип>(y)
надо работать с битами!
 
Ответить с цитированием

  #4  
Старый 23.09.2007, 21:06
VERte][
Участник форума
Регистрация: 17.05.2007
Сообщений: 220
С нами: 9992546

Репутация: 441
По умолчанию

тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
 
Ответить с цитированием

  #5  
Старый 23.09.2007, 21:08
scrat
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
С нами: 10048706

Репутация: 1540


По умолчанию

Цитата:
Сообщение от Vertexe  
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
чёто ты левое сказал: float это знак,порядок+32,мантиса.мне нужно из флоата инт получи ть
 
Ответить с цитированием

  #6  
Старый 23.09.2007, 21:27
DWORD
Участник форума
Регистрация: 24.07.2007
Сообщений: 138
С нами: 9894190

Репутация: 215
По умолчанию

Недавно как раз такую писал. Т.к. флоат занимает 32 бита, аргумент x в действительности является флоатом, просто по условию поставленной передо мной задачи этот тип использовать было вообще нельзя..
Код:
__int32 IntFormFloat(DWORD x) {
	CHAR poryadok = ((x >> 23) & 0xFF) - 127;
        if (poryadok < 0)
        	return 0;

        // Выталкиваем мантиссу и пририсовываем сэкономленную
        // нормализацией единицу
	__int32 mantissa = (x & 0x7FFFFF) | 0x800000;

        mantissa >>= (23 - poryadok);
	if (x >> 31)
        	mantissa *= -1;
	return mantissa;


}
 
Ответить с цитированием

  #7  
Старый 23.09.2007, 21:45
nerezus
Флудер
Регистрация: 12.08.2004
Сообщений: 3,791
С нами: 11444066

Репутация: 2290


По умолчанию

Код:
static inline int double2int(double d)
{
  const double t = d + 6755399441055744.0;
  return *((int *)(&t));
}
работает пиздец быстро, быстрее статиккастов и приведений типа (blahblah)
 
Ответить с цитированием

  #8  
Старый 23.09.2007, 21:46
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
С нами: 10721066

Репутация: 4360


По умолчанию

scrat: Ай-ай-ай я же сегодня подробно расписал как устроен float!

Цитата:
Сообщение от Vertexe  
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
Простите, с какого перепугу у Вас float из 4х частей состоит? 1|1379280000|0|02
 
Ответить с цитированием

  #9  
Старый 23.09.2007, 22:10
VERte][
Участник форума
Регистрация: 17.05.2007
Сообщений: 220
С нами: 9992546

Репутация: 441
По умолчанию

вещественное число
первая часть - знак числа, вторая - число, третья - знак степени, четвёртая - степень

сори с double перепутал =\

Последний раз редактировалось Vertexe; 23.09.2007 в 22:12..
 
Ответить с цитированием

  #10  
Старый 23.09.2007, 22:19
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
С нами: 10721066

Репутация: 4360


По умолчанию

float и double состоят из трех частей. http://en.wikipedia.org/wiki/IEEE_754
ты разделяешь одну из частей на две.. с тем же успехом можно экспоненту разделить на 8 частей и назвать их степенями двойки в экспоненте
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.