JavaRush /جاوا بلاگ /Random-UR /فلوٹنگ پوائنٹ نمبر کے اندر کیا ہے اور یہ کیسے کام کرتا ہے...
Ivan
سطح
Харьков

فلوٹنگ پوائنٹ نمبر کے اندر کیا ہے اور یہ کیسے کام کرتا ہے؟

گروپ میں شائع ہوا۔

مواد:

تصویر: http://pikabu.ru/

تعارف

جاوا سیکھنے کے پہلے ہی دنوں میں، میں نے فلوٹنگ پوائنٹ نمبرز جیسی عجیب قسم کی قدیم چیزیں دیکھیں۔ میں نے فوری طور پر ان کی خصوصیات میں دلچسپی لی اور اس سے بھی بڑھ کر یہ کہ وہ بائنری کوڈ میں لکھے گئے تھے (جو آپس میں جڑے ہوئے ہیں)۔ انٹیجرز کی کسی بھی رینج کے برعکس، یہاں تک کہ ایک بہت چھوٹی رینج میں (مثال کے طور پر، 1 سے 2 تک) ان کی لامحدود تعداد ہے۔ اور میموری کا ایک محدود سائز ہونے کی وجہ سے اس سیٹ کا اظہار کرنا ناممکن ہے۔ تو وہ بائنری میں کیسے ظاہر ہوتے ہیں اور وہ کیسے کام کرتے ہیں؟ افسوس، ویکی پر وضاحتیں اور یہاں Habré پر ایک بہت ہی عمدہ مضمون نے مجھے مکمل سمجھ نہیں دی، حالانکہ انہوں نے بنیاد رکھی۔ اس کا اندازہ صبح اس تجزیاتی مضمون کو پڑھنے کے بعد ہی ہوا۔

تاریخ میں سیر

( Habré پر اس مضمون سے لیا گیا ) 60-70 کی دہائی میں، جب کمپیوٹر بڑے تھے اور پروگرام چھوٹے تھے، تب بھی حساب کے لیے کوئی ایک معیار نہیں تھا، اور ساتھ ہی ساتھ تیرتے ہوئے پوائنٹ نمبر کو ظاہر کرنے کے لیے بھی ایک معیار تھا۔ ہر کمپیوٹر نے اسے مختلف طریقے سے کیا، اور ہر ایک کی اپنی غلطیاں تھیں۔ لیکن 70 کی دہائی کے وسط میں، انٹیل نے تعاون یافتہ "بہتر" ریاضی کے ساتھ نئے پروسیسرز بنانے اور ساتھ ہی اسے معیاری بنانے کا فیصلہ کیا۔ پروفیسر ولیم کاہن اور جان پامر (نہیں، بیئر کے بارے میں کتابوں کے مصنف نہیں) کو اسے تیار کرنے کے لیے لایا گیا تھا۔ کچھ ڈرامہ تھا، لیکن ایک نیا معیار تیار کیا گیا تھا. اب اس معیار کو IEEE754 کہا جاتا ہے۔

فلوٹنگ پوائنٹ نمبر فارمیٹ

یہاں تک کہ اسکول کی نصابی کتابوں میں بھی، ہر کسی کو 1.2 × 10 3 یا 1.2 E3 کی بہت بڑی یا بہت چھوٹی تعداد لکھنے کے ایک غیر معمولی طریقے کا سامنا کرنا پڑا، جو کہ 1.2 × 1000 = 1200 کے برابر ہے ۔ اسے ایکسپونینشل اشارے کا طریقہ کہا جاتا ہے۔ اس صورت میں، ہم فارمولے کا استعمال کرتے ہوئے نمبر کے اظہار کے ساتھ کام کر رہے ہیں: N=M×n p ، جہاں
  • N = 1200 - نتیجہ نمبر
  • M = 1,2 - mantissa - جزوی حصہ، اکاؤنٹ کے احکامات کو لینے کے بغیر
  • n = 10 آرڈر کی بنیاد ہے۔ اس صورت میں اور جب ہم کمپیوٹرز کے بارے میں بات نہیں کر رہے ہیں، بنیاد نمبر 10 ہے۔
  • p = 3 - بنیاد کی ڈگری
اکثر، آرڈر کی بنیاد کو 10 سمجھا جاتا ہے اور صرف مینٹیسا اور بیس کی قدر لکھی جاتی ہے، ان کو حرف E سے الگ کر کے۔ ہماری مثال میں، میں نے مساوی اندراجات 1.2 × 10 3 اور 1.2 E3 دیے ہیں اگر سب کچھ واضح ہے، اور ہم نے اسکول کے نصاب میں پرانی سیر مکمل کر لی ہے، تو اب میں اسے بھول جانے کی تجویز کرتا ہوں، کیونکہ فلوٹنگ پوائنٹ نمبر بناتے وقت ہم اس سے نمٹ رہے ہیں۔ دو کی طاقتیں، دسیوں کی نہیں، یعنی n = 2 ، پورا ہم آہنگ فارمولا 1.2E3 ٹوٹ جاتا ہے اور اس نے واقعی میرا دماغ توڑ دیا۔

دستخط اور ڈگری

И что мы имеем? В итоге мы также имеем двоичное число, которое состоит из мантиссы — часть, которую будем возводить в степень и саму степень. Кроме этого, так же How принято и у целочисленных типов, в числах с плавающей точкой есть бит, который определяет знак — будет число положительным or отрицательным. В качестве примера предлагаю рассмотреть тип float, который состоит из 32 бит. С числами двойной точности double логика такая же, только в два раза больше бит. Из 32 бит, первый старший отводится на знак, следующие 8 бит отводятся на экспоненту — степень, на которую будем возводить мантиссу, а остальные 23 бита — на мантиссу. Для демонстрации давайте посмотрим на пример пример: What внутри числа с плавающей точкой и How оно работает - 1С первым битом всё очень просто. Если meaning первого бита 0, то число, которое мы получим будет положительным. Если бит equals 1, то число будет отрицательным. Следующий блок из 8 бит — блок с экспонентой. Экспонента записывается How обычное восьмибитное число, а чтоб получить требуемую степень нам нужно из полученного числа вычесть 127 В нашем случае восемь бит экспоненты — это 10000001. Это соответствует числу 129. Если есть вопрос, How это посчитать, то на картинке быстрый ответ. Развёрнутый можно получить на любом курсе булевой алгебры. What внутри числа с плавающей точкой и How оно работает - 21×27 + 0×26 + 0×25 + 0×24 + 0×23 + 0×22 + 0×21 + 1×20 = 1×128 + 1×1 = 128+1=129 Не сложно посчитать, что максимальное число, которое мы можем получить из этих 8 бит 111111112 = 25510 (подстрочные 2 и 10 означают двоичную и десятеричную системы исчисления) Однако, если использовать только положительные значения степени (от 0 и до 255), то полученные числа будут иметь много чисел перед запятой, но не после? Whatб получать отрицательные значения степени, из сформированной экспоненты нужно вычитать 127. Таким образом, диапазон степеней будет от -127 до 128. Если использовать наш пример, то нужная степень будет 129-127 = 2. Пока запоминаем это число.

Мантисса

Теперь о мантиссе. Она состоит из 23 бит, однако в начале всегда подразумевается ещё одна единица, на которую биты не выделяются. Это сделано в целях целесообразности и экономии. Одно и то же число можно выражать разными степенями, добавляя к мантиссе нули перед or после запятой. Проще всего это понять с десятичной экспонентой: 120 000 = 1,2×105 = 0,12×106 = 0,012×107 = 0,0012×108 и т.д. Однако, введя фиксированное число в голове мантиссы мы каждый раз будем получать новые числа. Примем How данность, что перед нашими 23 битами будет ещё один с единицей. Обычно этот бит от остальных отделают точкой, которая, впрочем, ничего не значит. Просто так удобнее 1 . 11100000000000000000000 What внутри числа с плавающей точкой и How оно работает - 3Теперь полученную мантиссу нужно возводить в степень слева направо, уменьшая с каждым шагом степень на одну. Стартуем со значения степени, который мы получor в результате вычисления, т. е. 2 (Я специально выбрал простой пример, чтоб не писать каждое meaning степени двойки и в приведенной таблице не вычислял их, когда соответствующий бит equals нулю) What внутри числа с плавающей точкой и How оно работает - 41×22 + 1×21 + 1×20 + 1×2-1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7,5 и получor результат 7,5, правильность можно проверить, например, по этой ссылке

Итоги

Стандартное число с плавающей точкой типа float состоит из 32 бит, первый бит — знак (+ or -), следующие восемь — экспонента, следующие 23 — мантисса По знаку — если бит 0 — число положительное. Если бит 1 — отрицательное. По экспоненте — побитно переводим в десятичное число (первый слева бит — 128, второй — 64, третий — 32, четвёртый — 16, пятый — 8, шестой — 4, седьмой — 2, восьмой — 1), из полученного числа вычитаем 127, получаем степень с которой будем стартовать. По мантиссе — к имеющимся 23 битам спереди дописываем ещё один бит со meaningм 1 и с него начинаем возводить в полученную нами степень, с каждым следующим битом декрементируя эту степень. That's all folks, kids! What внутри числа с плавающей точкой и How оно работает - 5P. S.: В виде домашнего задания, используя эту статью, оставьте в комментариях свои версии, почему при большом количестве арифметических операций с числами с плавающей точкой возникают ошибки точности
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION