![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Могу ли я как-нибудь завести свой тип, который, например будет оперрировать с числами с плав. точкой и будет иметь диапозон [-5;5]?
И, есесно, будет занимать объём памяти соответствующе - маленький. -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
пиши класс, оверлоадь оператор '=', проверяей на значение... примерно так...
![]() --------------------
|
|||
|
||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Я думаю, что вот так: [-5][5]
![]() |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
и почему же он будет занимать маленький объем памяти? ограничение модуля пятеркой можно рассмотреть как ограничение на мантиссу (не больше там чего-то... около 2-3) это - приблизительно половина диапазона, значит выиграть получится 1 бит -------------------- qqq |
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Я бы скзал что, ограничение модуля 5 как раз устанавливает ограничение на сдвиг(<3).
А почему нельзя просто 1 бит -знак 3 бита--целая часть скока надо битов дробная. и того, если тебе надо обеспечить диапазон 10^-15 10=2^3=>диапазон=49 бит, но диапазон будет чуть хуже или 8 байт для даже большей точность чем 10^-15 |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно и так, но в вопросе было сказано про числа с плавающей запятой, а здесь описаны с фиксированной кстати, я ошибся маленько:
конечно же здесь имелась в виду экспонента -------------------- qqq |
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
gepard, вот лови:
-------------------- ![]() |
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
mr.DUDA[b], апплодисменты.
Вот не такой зрелищный вариант для типов с фиксированной и плавующей точкой. #include<iostream.h> #include<mem.h> #include <windows.h> typedef struct _fix_data { unsigned zn:1; unsigned ch:15; struct _fix_data &operator=(float a); }fd,*pfd; typedef struct _new_float_data { unsigned zn:1; unsigned exp:5; unsigned mant:26; struct _new_float_data &operator=(float); }nfd,*pnfd; fd operator+(fd,fd); nfd operator+(nfd,nfd); nfd& nfd::operator=(float a) { if((a>5)|(a<-5)) return *this; this->zn=(a<0); (a<0)?(a=-a) ![]() int i=0; while(a<33554432) { a*=2; i++; } this->exp=i; this->mant=(unsigned long)(int)a; return *this; } fd& fd::operator=(float a) { if((a>5)|(a<-5)) return *this; char zn=(a<0); (a<0)?(a=-a) ![]() a*=4096; this->ch=(unsigned long)a; this->zn=zn; return *this; } ostream& operator<<(ostream& f,fd a) { double k; k=((double)a.ch)/4096; (a.zn>0)?(k=-k) ![]() f<<k; } ostream& operator<<(ostream& f,nfd a ) { double k; unsigned long t=(1<<(a.exp)); k=(double)(a.mant)/(double)t; k*=(1-2*(a.zn>0)); f<<k; } fd operator+(fd a,fd b) { long n=a.zn+b.zn; long n_2=0; char fl; if(n==0) { a.ch+=b.ch; while(a.ch>20480) a.ch-=20480; a.zn=0; return a; } else if(n==2) { a.ch+=b.ch; while(a.ch>20480) a.ch-=20480; a.zn=1; return a; } else if(n==1) { if(b.ch>a.ch) { a.ch=b.ch-a.ch; a.zn=-a.zn; } else a.ch=a.ch-b.ch; return a; } } nfd operator+(nfd a,nfd b) { char n =a.zn+b.zn; unsigned long aa; unsigned long bb; unsigned long c; (a.exp<b.exp)?(c=a.exp) ![]() aa=(a.mant>>(a.exp-c)); bb=(b.mant>>(b.exp-c)); a.exp=c; if((n==0)|(n==2)) { aa+=bb; if(aa>67108864) { aa>>1; a.exp--; } if(aa>41943040) { aa-=41943040; } while(aa<0x2000000) { aa*=2; a.exp++; } a.mant=aa; return a; } if(n==1) { if(bb>aa) { aa=bb-aa; a.zn=-a.zn; } else aa=aa-bb; while(aa<0x2000000) { aa*=2; a.exp++; } a.mant=aa; return a; } } int main(int arc,char** arv) { double a; double b; nfd bc; nfd ad; bc=1.127; ad=-4.33; ad=ad+bc; cout<<ad<<' '<<(4.33-1.127); cin>>a; int i; i++; } |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Проблема битовых полей - это зависимость от компилятора. Неизвестно, каким по старшинству будет первое битовое поле в структуре, а каким-последнее.
-------------------- ![]() |
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
извини, за дискуссию..
Ты, безусловно, прав, однако тут с полями общаются по отдельности(т.е через компилятор). Вообще если бы не инвертированная мантисса в флоте и дубле, это следовало бы писать все на асме(было бы заметно быстрее)(видимо, это и задумывалось как курсовик по асму), но с учетом особенности 1--ломает. //З.ы. Что тебе в скобках то не понравилось??? Хм, ну я и урод... Люди скажите, как коды вставлять по нормальному, а то вместо скобок смайлы лезут Это сообщение отредактировал(а) DenDen - 19.5.2004, 09:51 |
|||
|
||||
gepard |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2477 Регистрация: 29.2.2004 Репутация: 2 Всего: 40 |
Спасибо, всем. Я ещё такой глупый.
![]() -------------------- Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным! © Я, Берсерк, что значит - Неистовый. |
|||
|
||||
Sined |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 19.5.2004 Репутация: 1 Всего: 0 |
Это ты к чему???
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |