Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

23.09.2007, 20:19
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
float<->int
Нужно написать прогу на c++ которая переводила бы из float'а в int и наоборот.Дело в том что писать надо не так:
Код:
float a=5.8;
int b=(int)a;
А работать надо с побитовыми операциями,мантисами и прочей чушнёй.Подскажите алгоритм/идею как это сделать хотяюы
|
|
|

23.09.2007, 20:45
|
|
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме: 3013539
Репутация:
441
|
|
b=static_cast<int>(a)
почему так как ты написал не подходит?
вообще общая формула приведения типов: x=static_cast<тип>(y)
Последний раз редактировалось Vertexe; 23.09.2007 в 20:53..
|
|
|

23.09.2007, 20:56
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
Сообщение от Vertexe
b=static_cast<int>(a)
почему так как ты написал не подходит?
вообще общая формула приведения типов: x=static_cast<тип>(y)
надо работать с битами!
|
|
|

23.09.2007, 21:06
|
|
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме: 3013539
Репутация:
441
|
|
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
|
|
|

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

23.09.2007, 21:27
|
|
Участник форума
Регистрация: 24.07.2007
Сообщений: 138
Провел на форуме: 165671
Репутация:
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;
}
|
|
|

23.09.2007, 21:45
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Код:
static inline int double2int(double d)
{
const double t = d + 6755399441055744.0;
return *((int *)(&t));
}
работает пиздец быстро, быстрее статиккастов и приведений типа (blahblah)
|
|
|

23.09.2007, 21:46
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
scrat: Ай-ай-ай я же сегодня подробно расписал как устроен float!
Сообщение от Vertexe
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
Простите, с какого перепугу у Вас float из 4х частей состоит? 1|1379280000|0|02
|
|
|

23.09.2007, 22:10
|
|
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме: 3013539
Репутация:
441
|
|
вещественное число
первая часть - знак числа, вторая - число, третья - знак степени, четвёртая - степень
сори с double перепутал =\
Последний раз редактировалось Vertexe; 23.09.2007 в 22:12..
|
|
|

23.09.2007, 22:19
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
float и double состоят из трех частей. http://en.wikipedia.org/wiki/IEEE_754
ты разделяешь одну из частей на две.. с тем же успехом можно экспоненту разделить на 8 частей и назвать их степенями двойки в экспоненте
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|