Просмотр полной версии : float<->int
Нужно написать прогу на c++ которая переводила бы из float'а в int и наоборот.Дело в том что писать надо не так:
float a=5.8;
int b=(int)a;
А работать надо с побитовыми операциями,мантисами и прочей чушнёй.Подскажите алгоритм/идею как это сделать хотяюы
b=static_cast<int>(a)
почему так как ты написал не подходит?
вообще общая формула приведения типов: x=static_cast<тип>(y)
b=static_cast<int>(a)
почему так как ты написал не подходит?
вообще общая формула приведения типов: x=static_cast<тип>(y)
надо работать с битами!
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
чёто ты левое сказал: float это знак,порядок+32,мантиса.мне нужно из флоата инт получи ть
Недавно как раз такую писал. Т.к. флоат занимает 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;
}
static inline int double2int(double d)
{
const double t = d + 6755399441055744.0;
return *((int *)(&t));
}
работает пиздец быстро, быстрее статиккастов и приведений типа (blahblah)
scrat: Ай-ай-ай я же сегодня подробно расписал как устроен float!
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???
Простите, с какого перепугу у Вас float из 4х частей состоит? 1|1379280000|0|02
вещественное число
первая часть - знак числа, вторая - число, третья - знак степени, четвёртая - степень
сори с double перепутал =\
float и double состоят из трех частей. http://en.wikipedia.org/wiki/IEEE_754
ты разделяешь одну из частей на две.. с тем же успехом можно экспоненту разделить на 8 частей и назвать их степенями двойки в экспоненте
отсюда следует, что в инсте говорят не в соответствии со стандартами =\
я очень не понимаю людей которые учатся в заведениях типа мфюа на программистов и жалуются на уровень преподавания.
я учусь в МГУ ВМиК =\
поэтому очень обидно
отсюда следует, что в инсте говорят не в соответствии со стандартами =\ это как? знак, мантиса, степень. Вам еще что-то добавили? )
нам добавили знак степени
halkfild
24.09.2007, 00:17
то что тебе говорят это правильно
просто та часть, что выделяется как отдельная и является знаковым битом это не так принципиально суть одна и та же
а по вопросу мона получить адрес и прочитать порядок и потом нужное количество разрядов мантисы
просто та часть, что выделяется как отдельная и является знаковым битом это не так принципиально суть одна и та же
Ой да зачем чтото вообще разделять, все числа будем считать набором бит. Все данные набором байт. Структуры, юнионы, битовые поля явно не для нас.
а по вопросу мона получить адрес и прочитать порядок и потом нужное количество разрядов мантисы
Нужное это какое? Порядок задается как показатель у степени двойки, придется сначала флоат полюбому преобразовыать в вид с фиксированной запятой, потом отбрасывать дробную часть
нам добавили знак степени
Знак у степени действительно есть, но отдельно не выделяется (нафига?!) и вообще порядок другой у полей.
чуваки а меня в 9-ом(!) классе с этим трахают
тебя в 9м теоремой Лапласа с доказательством для определителя матрицы трахают?) Или Машиной Тьюринга с Нормальными Алгоритмами Маркова???
вот это трахают, а хня про запись чисел в памяти у нас была ток пол-лекции для повторения причём всё это достаточно не муторно...
#include <iostream.h>
#include <conio.h>
union {float x;unsigned long t;}a;
void main()
{
clrscr();
cout<<">";
cin>>a.x;
unsigned long p=a.t&0x7F800000;
p=a.t>>23;
p-=127;
unsigned long m=a.t&0x007FFFFF;
m>>=23-p;
m=m|(1<<p);
cout<<m;
getch();
}
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot