Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   float<->int (https://forum.antichat.xyz/showthread.php?t=49688)

scrat 23.09.2007 20:19

float<->int
 
Нужно написать прогу на 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

Цитата:

Сообщение от Vertexe
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

Цитата:

Сообщение от Vertexe
тобишь если у тебя есть к примеру число:
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!

Цитата:

Сообщение от Vertexe
тобишь если у тебя есть к примеру число:
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 частей и назвать их степенями двойки в экспоненте


Время: 18:20