ورود

View Full Version : منظور از طول 4 بایت در نوع float چیست ؟



mkbo_webmaster
سه شنبه 12 اردیبهشت 1385, 11:25 صبح
در نوع عدد اعشاری از نوع float اشاره شده که 4 بایت را میتواند به خود برای ذخیره اعداد اعشاری کوچک اختصاص دهد.
حالا منظور از این 4 بایت چیست ؟
- یعنی آیا ما میتوانیم عدد 9999 را در آن ذخیره کنی.
- اگر میتوانیم پس اطلاعات مربوط به ممیز اعشاری کجای این 4 بایت ذخیره میشود ؟
- اعداد ریز اعشاری چه ؟
متشکر



/

Mahdi_Delphi
سه شنبه 12 اردیبهشت 1385, 11:58 صبح
یعنی آیا ما میتوانیم عدد 9999 را در آن ذخیره کنی.

این طرز فکر شما کدینگ BCD را به یاد آدم میاورد !
شما فکر میکنید توی هر بایت یه عدد بین 0 تا 9 جا میشه؟
توی هر بایت 2 به توان 8 عدد جا میشه. یعنی در یک بایت 256 عدد جا میشه.(از صفر تا 255)

در ضمن اعداد اعشاری با فرمت خاصی ذخیره میشن.

mzjahromi
سه شنبه 12 اردیبهشت 1385, 12:04 عصر
در نوع عدد اعشاری از نوع float اشاره شده که 4 بایت را میتواند به خود برای ذخیره اعداد اعشاری کوچک اختصاص دهد.
حالا منظور از این 4 بایت چیست ؟
- یعنی آیا ما میتوانیم عدد 9999 را در آن ذخیره کنی.
- اگر میتوانیم پس اطلاعات مربوط به ممیز اعشاری کجای این 4 بایت ذخیره میشود ؟
- اعداد ریز اعشاری چه ؟
متشکر
نه یعنی برای ذخیره سازی عدد Float به 4 بایت نیاز داریم
اگه اشتباه نکنم عدد Float 4 بایتی می تونه تا 7 رقم با معنی رو درون خودش نگهداری کنه.
و Double 8 بایتی تا 17 رقم با معنی ولی این ارقام با استفاده از نماد علمی می تونن مقادیر خیلی بزرگتری رو نگهداری کنند.
نحوه ذخیره سازی نوع 4 بایتی هم به شکل زیر هست


S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31

اگه کافی نبود بگو تا بیشتر توضیح بدم

mamadgmail
سه شنبه 12 اردیبهشت 1385, 22:49 عصر
ببنید منظور اینه که برای ذخیره متغییر هایی از نوع float , ما 4 بایت یعنی 4*8=32 bit از حافظه رو داریم و بنابراین حداکثر عددی که می توان در این 32 بیت قرار داد این است که همه بیت ها یک باشه البته اگر بخوایم اعداد علامت دار رو هم ذخیره کنیم خوب اولین بیت سمت چپ بیت علامت می شود که بنابراین 31 بیت برای ذخیره عدد داریم.

mzjahromi
چهارشنبه 13 اردیبهشت 1385, 06:54 صبح
ببنید منظور اینه که برای ذخیره متغییر هایی از نوع float , ما 4 بایت یعنی 4*8=32 bit از حافظه رو داریم و بنابراین حداکثر عددی که می توان در این 32 بیت قرار داد این است که همه بیت ها یک باشه البته اگر بخوایم اعداد علامت دار رو هم ذخیره کنیم خوب اولین بیت سمت چپ بیت علامت می شود که بنابراین 31 بیت برای ذخیره عدد داریم.
ولی این برای Int هست و برای Float روش کار فرق میکنه و 31 بیت به سه قسمت تقسیم میشن و در واقع ما 23 بیت برای ذخیره سازی عدد داریم 8 بیت برای نما و 1 بیت علامت

mamadgmail
چهارشنبه 13 اردیبهشت 1385, 10:16 صبح
بله فکر کنم حق با شما باشه من به این جاش فکر نکرده بودم.اگر براتون امکان داره می شه یکمی راجب این موضوع توضیح بدید.

mzjahromi
چهارشنبه 13 اردیبهشت 1385, 10:40 صبح
بایت اول که علامته
8 بایت بعد هم نما هست(به صورت علامت دار)
23 بایت بعد هم خود عدد به صورت نرمالسازی شده هست
عدد نرمالسازی شده هم یه عددی هست به شکل زیر
1.#####
که اون 1 قبل از ممیز رو نمینویسن و فقط اعداد بعد از ممیز درون متغیر ذخیره میشه

mamadgmail
چهارشنبه 13 اردیبهشت 1385, 16:05 عصر
ممنون حالا متوجه شدم.

bersisa
پنج شنبه 02 مهر 1394, 11:28 صبح
بایت اول که علامته
8 بایت بعد هم نما هست(به صورت علامت دار)
23 بایت بعد هم خود عدد به صورت نرمالسازی شده هست
عدد نرمالسازی شده هم یه عددی هست به شکل زیر
1.#####
که اون 1 قبل از ممیز رو نمینویسن و فقط اعداد بعد از ممیز درون متغیر ذخیره میشه


ببخشد حالا اگه عددی رقم سمت چپش 1 نباشد چطور؟ باز هم نباید نوشته شود؟!؟
مثلا عدد 3.557542.

rahnema1
پنج شنبه 02 مهر 1394, 17:21 عصر
ببخشد حالا اگه عددی رقم سمت چپش 1 نباشد چطور؟ باز هم نباید نوشته شود؟!؟
مثلا عدد 3.557542.

سلام
تاپیک 9 سال پیشه!
نحوه ذخیره اعداد اعشاری در کامپیوتر (دودویی) به یه صورت خاصه که فکر کنم لازم باشه به منابعی مانند زیر مراجعه کنید:
http://en.wikipedia.org/wiki/Floating_point

http://en.wikipedia.org/wiki/IEEE_floating_point

bersisa
شنبه 04 مهر 1394, 05:02 صبح
سلام.
استاد! حالا نمی شه در حد سواد ما توضیح بدین!

rahnema1
شنبه 04 مهر 1394, 20:35 عصر
مطالب آموزشی تو اینترنت زیاده کتابهای فارسی هم هست
مثلا لینک زیر را مشاهده کنید
http://www.tfinley.net/notes/cps104/floating.html
یا
https://en.wikipedia.org/wiki/IEEE_754-1985
در مورد اعداد عشاری وقتی می خواستیم مثلا عدد 22.589 را بنویسیم می تونستیم به صورت زیر بنویسیم:
2*10^1 + 2*10^0 + 5*10^(-1) + 8*10^(-2) + 9*10^(-3)
اعداد دودویی هم می تونند ممیز داشته باشند مثلا عدد 101011.101 را می تونیم به صورت زیر بنویسیم
1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 + 1*2^(-1) + 0*2^(-2) + 1*2^(-3) = 43.625
حالا اگه بخواهیم این عدد را در یک float که 32 بیتی هست قرار بدیم لازمه چند کار دیگه هم انجام بدیم
ابتدا عدد دودویی که داشتیم را باید به صورت نماد علمی در بیاریم.
مثلا نماد علمی 101011.101 می شه :
1.01011101 * 2^5
که 1.01011101 می شه ضریب 2 و 5 هم می شه توان 2
دقت کنید که نماد علمی عدد دودویی حتما باید با 1 شروع بشه و مثلا نباید نماد علمی را به صورت زیر بنویسیم
0.101011101 * 2^6
اما عدد float از سه قسمت تشکیل شده:

ضریب توان علامت
X XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX

1 . بیت اول که نشان دهنده علامت مثبت یا منفی بودن عدد هست. اگه بیت اول 0 باشه یعنی مثبت و اگه 1 باشه یعنی منفی
2 . تعداد 8 بیت که برای نشان دادن توان اون نماد علمی استفاده می شه
3 . تعداد 23 بیت جهت نشان دادن ضریب نماد علمی استفاده می شه
خب حالا می رویم سراغ عدد خودمون عدد که چون یک عدد مثبت هست بیت اول را صفر میذاریم
توان نماد علمی برابر با 5 هست. قاعده اش اینه که همیشه توان را با 127 باید حمع کنیم که جواب می شه 5+127=132. عدد 132 را به صورت دودویی در میاریم که می شه 10000100 و این عدد را در اون 8 بیت مورد نظر جا می دهیم
در مورد ضریب نماد علمی گفتیم که همیشه عدد اول باید 1 باشه. چون می دونیم همیشه اون عدد 1 هست از اون صرف نظر می کنیم و مابقی اعداد پشت ممیز یعنی 01011101 را در اون 23 بیت جا می دهیم
بنابراین عدد ما می شه
01000010001011101000000000000000
از کد زیر می تونید استفاده کنید
ابتدا معادل دودویی 43.625
سپس کوچکترین عدد نرمال قابل نمایش در float و
نهایتا تفاوت بزرگترین عدد قابل نمایش در float با عدد قبل از اون که می بینید فاصله این دو عدد چه قدر زیاده

#include <bitset>
#include <iostream>

std::string float_to_binary(float num)
{
std::bitset<32> bit(*reinterpret_cast<unsigned int*>(&num));
return bit.to_string();
}
float binary_to_float(std::string binary)
{
unsigned int num = static_cast<unsigned int>( std::bitset<32>(binary).to_ulong());
return *reinterpret_cast<float*> (&num);
}
/*float binary_to_float1(std::string binary)
{
int num = stoi(binary, 0, 2);
return *reinterpret_cast<float*> (&num);
}*/
int main()
{

std::cout << float_to_binary(43.625) << std::endl;

std::cout << binary_to_float ("00000000100000000000000000000000") << std::endl;

std::cout << binary_to_float ("01111111011111111111111111111111") -
binary_to_float ("01111111011111111111111111111110") << std::endl;
}