PDA

Просмотр полной версии : float<->int


scrat
23.09.2007, 20:19
Нужно написать прогу на c++ которая переводила бы из float'а в int и наоборот.Дело в том что писать надо не так:

float a=5.8;
int b=(int)a;

А работать надо с побитовыми операциями,мантисами и прочей чушнёй.Подскажите алгоритм/идею как это сделать хотяюы

VERte][
23.09.2007, 20:45
b=static_cast<int>(a)
почему так как ты написал не подходит?

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

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

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

VERte][
23.09.2007, 21:06
тобишь если у тебя есть к примеру число:
1|1379280000|0|02 --> -0.137928e2
то тебе его надо перевести в:
1|000000000013 ???

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

DWORD
23.09.2007, 21:27
Недавно как раз такую писал. Т.к. флоат занимает 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;


}

nerezus
23.09.2007, 21:45
static inline int double2int(double d)
{
const double t = d + 6755399441055744.0;
return *((int *)(&t));
}

работает пиздец быстро, быстрее статиккастов и приведений типа (blahblah)

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

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

VERte][
23.09.2007, 22:10
вещественное число
первая часть - знак числа, вторая - число, третья - знак степени, четвёртая - степень

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

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

VERte][
23.09.2007, 22:48
отсюда следует, что в инсте говорят не в соответствии со стандартами =\

ZaCo
23.09.2007, 23:27
я очень не понимаю людей которые учатся в заведениях типа мфюа на программистов и жалуются на уровень преподавания.

VERte][
23.09.2007, 23:35
я учусь в МГУ ВМиК =\
поэтому очень обидно

nerezus
24.09.2007, 00:12
отсюда следует, что в инсте говорят не в соответствии со стандартами =\ это как? знак, мантиса, степень. Вам еще что-то добавили? )

VERte][
24.09.2007, 00:13
нам добавили знак степени

halkfild
24.09.2007, 00:17
то что тебе говорят это правильно

просто та часть, что выделяется как отдельная и является знаковым битом это не так принципиально суть одна и та же

а по вопросу мона получить адрес и прочитать порядок и потом нужное количество разрядов мантисы

_Great_
24.09.2007, 07:04
просто та часть, что выделяется как отдельная и является знаковым битом это не так принципиально суть одна и та же
Ой да зачем чтото вообще разделять, все числа будем считать набором бит. Все данные набором байт. Структуры, юнионы, битовые поля явно не для нас.

а по вопросу мона получить адрес и прочитать порядок и потом нужное количество разрядов мантисы
Нужное это какое? Порядок задается как показатель у степени двойки, придется сначала флоат полюбому преобразовыать в вид с фиксированной запятой, потом отбрасывать дробную часть

_Great_
24.09.2007, 07:04
нам добавили знак степени
Знак у степени действительно есть, но отдельно не выделяется (нафига?!) и вообще порядок другой у полей.

scrat
24.09.2007, 07:49
чуваки а меня в 9-ом(!) классе с этим трахают

VERte][
24.09.2007, 19:14
тебя в 9м теоремой Лапласа с доказательством для определителя матрицы трахают?) Или Машиной Тьюринга с Нормальными Алгоритмами Маркова???

вот это трахают, а хня про запись чисел в памяти у нас была ток пол-лекции для повторения причём всё это достаточно не муторно...

scrat
28.09.2007, 13:10
#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();
}