გამოიყენება უარყოფითი რიცხვების წარმოსაჩენად. მცურავი წერტილის ნომრის ფორმატი. მცურავი წერტილის ნომრის წარმოდგენის ალგორითმი

ვისაც ოდესმე უფიქრია გამხდარიყო "IT სპეციალისტი" ან სისტემის ადმინისტრატორი, და უბრალოდ ბედთან დაკავშირება იმის ცოდნასთან, თუ როგორ არის წარმოდგენილი რიცხვები, აბსოლუტურად აუცილებელია. ყოველივე ამის შემდეგ, სწორედ ამაზეა დაფუძნებული პროგრამირების ენები. დაბალი დონე, როგორიცაა ასამბლერი. ამიტომ, დღეს ჩვენ შევხედავთ რიცხვების წარმოდგენას კომპიუტერში და მათ განთავსებას მეხსიერების უჯრედებში.

აღნიშვნა

თუ ამ სტატიას კითხულობთ, ალბათ უკვე იცით ეს, მაგრამ გამეორება ღირს. ყველა მონაცემი შედის პერსონალური კომპიუტერიშენახული ბინარში ეს ნიშნავს, რომ ნებისმიერი რიცხვი უნდა იყოს წარმოდგენილი შესაბამისი ფორმით, ანუ შედგება ნულებისაგან და ერთებისგან.

ჩვენთვის ნაცნობი ათობითი რიცხვები კომპიუტერისთვის გასაგებ ფორმად გადასაყვანად, თქვენ უნდა გამოიყენოთ ქვემოთ აღწერილი ალგორითმი. ასევე არსებობს სპეციალიზებული კალკულატორები.

ასე რომ, იმისათვის, რომ რიცხვი გადავიტანოთ ორობით რიცხვთა სისტემაში, უნდა ავიღოთ ჩვენ მიერ არჩეული მნიშვნელობა და გავყოთ 2-ზე. ამის შემდეგ მივიღებთ შედეგს და ნარჩენს (0 ან 1). შედეგს ისევ ვყოფთ 2-ზე და ვიხსენებთ დანარჩენს. ეს პროცედურაუნდა განმეორდეს მანამ, სანამ საბოლოო შედეგი ასევე არ იქნება 0 ან 1. შემდეგ ჩავწერთ საბოლოო ღირებულებადა ნაშთები საპირისპირო მიზნითროგორ მივიღეთ ისინი.

ზუსტად ასეა წარმოდგენილი რიცხვები კომპიუტერში. ნებისმიერი რიცხვი იწერება ორობითი ფორმით და შემდეგ იკავებს მეხსიერების უჯრედს.

მეხსიერება

როგორც უკვე უნდა იცოდეთ, მინიმალური ერთეულიგაზომვის ინფორმაცია არის 1 ბიტი. როგორც უკვე გავარკვიეთ, რიცხვები წარმოდგენილია კომპიუტერში ბინარულ ფორმატში. ამრიგად, მეხსიერების თითოეული ბიტი დაიკავებს ერთი მნიშვნელობით - 1 ან 0.

უჯრედები გამოიყენება შესანახად. თითოეული ასეთი ერთეული შეიცავს 8 ბიტამდე ინფორმაციას. აქედან გამომდინარე, შეგვიძლია დავასკვნათ, რომ მეხსიერების თითოეულ სეგმენტში მინიმალური მნიშვნელობა შეიძლება იყოს 1 ბაიტი ან იყოს რვანიშნა ბინარული რიცხვი.

მთელი

ბოლოს მივდივართ კომპიუტერში მონაცემების პირდაპირ განთავსებამდე. როგორც უკვე აღვნიშნეთ, პირველი, რასაც პროცესორი აკეთებს, არის ინფორმაციის ორობით ფორმატში გადაქცევა და მხოლოდ ამის შემდეგ მოთავსება მეხსიერებაში.

დავიწყოთ ძალიან მარტივი ვარიანტი, რომელიც წარმოადგენს მთელ რიცხვებს კომპიუტერში. კომპიუტერის მეხსიერება ამ პროცესისთვის გამოყოფს უჯრედების სასაცილოდ მცირე რაოდენობას - მხოლოდ ერთს. ამრიგად, მაქსიმუმ ერთ სლოტს შეიძლება ჰქონდეს მნიშვნელობები 0-დან 11111111-მდე. მოდით ვთარგმნოთ მაქსიმალური რაოდენობაჩაწერის ფორმაში, რომელსაც ჩვენ ვიცნობთ.
X = 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 1 × 2 8 - 1 = 255 .

ახლა ჩვენ ვხედავთ, რომ მეხსიერების ერთი უჯრედი შეიძლება შეიცავდეს მნიშვნელობას 0-დან 255-მდე. თუმცა, ეს ეხება ექსკლუზიურად არაუარყოფით მთელ რიცხვებს. თუ კომპიუტერს სჭირდება უარყოფითი მნიშვნელობის დაწერა, ყველაფერი ცოტა სხვაგვარად იმუშავებს.

უარყოფითი რიცხვები

ახლა ვნახოთ, როგორ არის წარმოდგენილი რიცხვები კომპიუტერში, თუ ისინი უარყოფითია. ნულზე ნაკლები მნიშვნელობის დასაკმაყოფილებლად გამოიყოფა მეხსიერების ორი უჯრედი ან 16 ბიტი ინფორმაცია. ამ შემთხვევაში, 15 შედის თავად რიცხვის ქვეშ, ხოლო პირველი (მარცხნივ) ბიტი მოცემულია შესაბამისი ნიშნის ქვეშ.

თუ რიცხვი უარყოფითია, მაშინ იწერება "1", თუ დადებითი, მაშინ "0". დამახსოვრების გასაადვილებლად შეგვიძლია შემდეგი ანალოგიის დახატვა: თუ არის ნიშანი, მაშინ ვსვამთ 1-ს, თუ ის არ არის, მაშინ არაფერი (0).

დარჩენილი 15 ბიტი ინფორმაცია ნაწილდება ნომერზე. წინა შემთხვევის მსგავსად, მათ შეუძლიათ მაქსიმუმ თხუთმეტი ერთეულის განთავსება. აღსანიშნავია, რომ უარყოფითი და დადებითი რიცხვების ჩაწერა მნიშვნელოვნად განსხვავდება ერთმანეთისგან.

იმისათვის, რომ მეხსიერების 2 უჯრედში ნულზე მეტი ან ტოლი მნიშვნელობის დასაყენებლად გამოიყენება ე.წ. პირდაპირი კოდი. ეს ოპერაციაიწარმოება ისევე, როგორც აღწერილია, და მაქსიმალური A = 32766, მაშინვე მინდა აღვნიშნო, რომ ამ შემთხვევაში"0" ნიშნავს დადებითს.

მაგალითები

კომპიუტერის მეხსიერებაში მთელი რიცხვების წარმოდგენა არც ისე რთული საქმეა. თუმცა ცოტა უფრო რთულდება თუ ჩვენ ვსაუბრობთუარყოფითი მნიშვნელობის შესახებ. ნულზე ნაკლები რიცხვის დასაწერად გამოიყენება ორის შემავსებელი კოდი.

მის მისაღებად, მანქანა ასრულებს მთელ რიგ დამხმარე ოპერაციებს.

  1. ჯერ მოდული იწერება უარყოფითი რიცხვიბინარული რიცხვი. ანუ კომპიუტერს ახსოვს მსგავსი, მაგრამ დადებითი მნიშვნელობა.
  2. შემდეგ მეხსიერების თითოეული ბიტი ინვერსიულია. ამისთვის ყველა მათგანი იცვლება ნულებით და პირიქით.
  3. შედეგს დაამატეთ "1". ეს იქნება დამატებითი კოდი.

მივცეთ ნათელი მაგალითი. გვქონდეს რიცხვი X = - 131. ჯერ ვიღებთ მის მოდულს |X|= 131. შემდეგ გადავიყვანთ ორობით სისტემაში და ვწერთ 16 უჯრედში. ვიღებთ X = 0000000010000011. ინვერსიის შემდეგ X = 1111111101111100. ჩვენ მას "1"-ს ვამატებთ და ვიღებთ დაბრუნების კოდი X=1111111101111101. 16-ბიტიან მეხსიერების უჯრედში ჩასაწერად მინიმალური რიცხვია X = - (2 15) = - 32767.

გრძელი მთელი რიცხვები

როგორც ხედავთ, კომპიუტერში რეალური რიცხვების წარმოდგენა არც ისე რთულია. თუმცა, განხილული დიაპაზონი შეიძლება არ იყოს საკმარისი ოპერაციების უმეტესობისთვის. ამიტომ, იმისათვის, რომ მოათავსოთ დიდი რიცხვები, კომპიუტერი გამოყოფს 4 უჯრედს, ანუ 32 ბიტს მეხსიერებიდან.

ჩაწერის პროცესი აბსოლუტურად არაფრით განსხვავდება ზემოთ წარმოდგენილიდან. ასე რომ, ჩვენ უბრალოდ მივცემთ რიცხვების დიაპაზონს, რომელიც შეიძლება შეინახოს ამ ტიპში.

X max =2,147,483,647.

X წთ = - 2 147 483 648.

უმეტეს შემთხვევაში, ეს მნიშვნელობები საკმარისია მონაცემებით ოპერაციების ჩასაწერად და შესასრულებლად.

კომპიუტერში რეალური რიცხვების წარმოდგენას აქვს თავისი დადებითი და უარყოფითი მხარეები. ერთის მხრივ, ეს ტექნიკა აადვილებს ოპერაციების შესრულებას მთელ რიცხვებს შორის, რაც მნიშვნელოვნად აჩქარებს პროცესორს. მეორეს მხრივ, ეს დიაპაზონი არ არის საკმარისი ეკონომიკის, ფიზიკის, არითმეტიკისა და სხვა მეცნიერებების უმეტესი პრობლემების გადასაჭრელად. ამიტომ, ახლა ჩვენ განვიხილავთ სხვა ტექნიკას სუპერ სიდიდებისთვის.

მცურავი წერტილი

ეს არის ბოლო, რაც უნდა იცოდეთ კომპიუტერში რიცხვების წარმოდგენის შესახებ. ვინაიდან წილადების წერისას არის მათში ათობითი წერტილის პოზიციის განსაზღვრის პრობლემა, კომპიუტერში ასეთი ციფრების განსათავსებლად გამოიყენება სამეცნიერო აღნიშვნა.

ნებისმიერი რიცხვი შეიძლება წარმოდგენილი იყოს შემდეგი სახით X = m * p n სადაც m არის რიცხვის მანტისა, p არის რიცხვითი სისტემის საფუძველი და n არის რიცხვის მაჩვენებელი.

მცურავი პუნქტიანი რიცხვების ჩაწერის სტანდარტიზებისთვის გამოიყენეთ შემდეგი პირობა, რომლის მიხედვითაც მანტისას მოდული უნდა იყოს 1/ნ-ზე მეტი ან ტოლი და 1-ზე ნაკლები.

მოდით მივცეთ რიცხვი 666.66. მოდით დავაყენოთ ექსპონენციალური ფორმით. გამოდის X = 0.66666 * 10 3. P = 10 და n = 3.

მცურავი წერტილის მნიშვნელობები ჩვეულებრივ გამოიყოფა 4 ან 8 ბაიტი (32 ან 64 ბიტი). პირველ შემთხვევაში მას ეწოდება რეგულარული სიზუსტის რიცხვი, ხოლო მეორე შემთხვევაში მას ორმაგი სიზუსტის რიცხვი.

ციფრების შესანახად გამოყოფილი 4 ბაიტიდან, 1 (8 ბიტი) გამოიყოფა ბრძანებისა და მისი ნიშნის შესახებ მონაცემებისთვის, ხოლო 3 ბაიტი (24 ბიტი) გამოიყენება მანტისას და მისი ნიშნის შესანახად იმავე პრინციპების შესაბამისად, როგორც მთელი რიცხვების მნიშვნელობებისთვის. . ამის ცოდნით, შეგვიძლია მარტივი გამოთვლების განხორციელება.

მაქსიმალური მნიშვნელობა n = 1111111 2 = 127 10. მასზე დაყრდნობით შეგვიძლია მივიღოთ მაქსიმალური ზომანომერი, რომელიც შეიძლება ინახებოდეს კომპიუტერის მეხსიერებაში. X=2 127 . ახლა ჩვენ შეგვიძლია გამოვთვალოთ მაქსიმალური მანტისა. ის ტოლი იქნება 2 23 - 1 ≥ 2 23 = 2 (10 × 2.3) ≥ 1000 2.3 = 10 (3 × 2.3) ≥ 10 7. შედეგად მივიღეთ სავარაუდო მნიშვნელობა.

თუ ახლა გავაერთიანებთ ორივე გამოთვლას, მივიღებთ მნიშვნელობას, რომელიც დაკარგვის გარეშე შეიძლება ჩაიწეროს მეხსიერების 4 ბაიტში. ის ტოლი იქნება X = 1.701411 * 10 38. დარჩენილი რიცხვები გაუქმდა, რადგან ეს არის ზუსტად ის სიზუსტე, რომელიც გვაძლევს საშუალებას ამ მეთოდითჩანაწერები.

ორმაგი სიზუსტე

ვინაიდან ყველა გამოთვლა წინა აბზაცში იყო ახსნილი და ახსნილი, აქ ძალიან მოკლედ გეტყვით ყველაფერს. ორმაგი სიზუსტის რიცხვებისთვის, როგორც წესი, არის 11 ბიტი მაჩვენებლისა და მისი ნიშნისთვის, ასევე 53 ბიტი მანტისისთვის.

P = 1111111111 2 = 1023 10.

M = 2 52 -1 = 2 (10*5.2) = 1000 5.2 = 10 15.6. მრგვალი მდე დიდი მხარედა მივიღებთ მაქსიმალურ რიცხვს X = 2 1023 ზუსტი "m".

ვიმედოვნებთ, რომ ჩვენ მიერ მოწოდებული ინფორმაცია კომპიუტერში მთელი და რეალური რიცხვების წარმოდგენის შესახებ გამოგადგებათ სწავლაში და ოდნავ მაინც იქნება უფრო მკაფიო, ვიდრე ჩვეულებრივ სახელმძღვანელოებში წერია.

Ზოგადი ინფორმაცია.

Მონაცემთა ტიპი- ეს ორობითი კოდი, რომელსაც აქვს ცნობილი თვისებები მიღებული კონვენციების მიხედვით. პროცესორი (ბრძანებების გამოყენებით) ამოიცნობს მონაცემთა ტიპს და ასრულებს ოპერაციების დადგენილ კომპლექტს მონაცემებზე.

ქვემოთ განიხილება შემდეგი ტიპებიმონაცემები:

● ს ხელმოწერილი და ხელმოუწერელი მთელი რიცხვები, გამოიყენება მთელი რიცხვების ორობითი კოდების სახით წარმოსაჩენად და მათზე არითმეტიკული მოქმედებების შესასრულებლად ბინარული არითმეტიკის წესების მიხედვით;

BCD მთელი რიცხვები, შექმნილია ათობითი რიცხვების წარმოსაჩენად და დასამუშავებლად;

ლოგიკური ტიპიმონაცემებიალგებრა-ლოგიკის წესების მხარდაჭერა ( ლოგიკური ალგებრა);

ფიქსირებული და მცურავი წერტილის ტიპები, განკუთვნილია რეალური რიცხვების წარმოსაჩენად და დასამუშავებლად.

მონაცემთა ტიპის არჩევანი განისაზღვრება პროგრამის ბრძანებით. მაგალითად, არითმეტიკული ინსტრუქციის შესრულებისას, მონაცემები განიხილება, როგორც მთელი რიცხვები, ოპერანდები ლოგიკური ოპერაციამიღებულია როგორც ლოგიკური მონაცემთა ტიპი და 16-ბიტიანი მაჩვენებელი გამოიყენება ინსტრუქციით მიმდინარე სეგმენტში მონაცემებზე წვდომისთვის.

გაითვალისწინეთ, რომ ენების პროგრამებში მაღალი დონეშეიძლება არსებობდეს მონაცემთა ტიპები, რომელთათვისაც პროცესორს არ აქვს ტექნიკის მხარდაჭერა. მაგალითი იქნება მცურავი წერტილის მონაცემთა ტიპები Fort Run პროგრამაში, რომელიც მუშაობს გამოთვლითი სისტემაკოპროცესორის გარეშე. ამ შემთხვევაში, გამოთვლები გამოიყენება დამატებითი ბრძანებებიმცურავი წერტილის მონაცემთა ტიპების მოდელირებისთვის. ბუნებრივია, თუ სისტემაში არის თანაპროცესორი (და Fortran-ის შემდგენელი), პროგრამა ბევრად უფრო სწრაფად შესრულდება.

რიცხვების წარმოდგენის ფორმებზე.

რიცხვების წარმოსაჩენად ფართოდ გამოიყენება ორი ფორმა: ბუნებრივი და ნორმალური.

ზე ბუნებრივიწარმოდგენის სახით რიცხვს აქვს ერთი ტიპის ჩანაწერი, მაგალითად: +195 - დადებითი მთელი რიცხვი; –195 არის უარყოფითი მთელი რიცხვი; +0,025 - სათანადო დადებითი ფრაქცია; –195.025 არის არასწორი უარყოფითი წილადი. ეს ფორმა გამოიყენება მთელი რიცხვების და ფიქსირებული წერტილის (მძიმით) რიცხვების წარმოსაჩენად.

ზე ნორმალურიწარმომადგენლობის ფორმა, ნომერი იწერება ფორმაში

სადაც M, P არის მანტისა და რიცხვის რიგი.

წარმოდგენის ნორმალურ ფორმას ახასიათებს რიცხვის ორაზროვანი აღნიშვნა, მაგალითად: +195.025 = +195025. 10 –3 = +19.5025. 10 1 = +0.195025. 10 3. როგორც მაგალითიდან ჩანს, მანტისას წერტილის პოზიცია დამოკიდებულია P რიგის მნიშვნელობაზე. P-ის ცვლილებით (რაც ყოველთვის ხდება გამოთვლის პროცესში), წერტილი თითქოს იწყებს ცურვას. მაშასადამე, ნორმალურ ფორმას (2.3.1) ასევე უწოდებენ მცურავი პუნქტიანი რიცხვების წარმოდგენის ფორმას.

ციფრული (როგორც ნებისმიერი სხვა) ინფორმაცია, რომელიც ექვემდებარება პროცესორის დამუშავებას, წარმოდგენილია ფორმაში

- ბიტური ორობითი კოდები, რომელთა შესანახად გამოიყენება მეხსიერების უჯრედები. ორობითი რიცხვების კოდებს განსხვავებული ფორმატები აქვთ.

რიცხვის ფორმატი არის ციფრების ერთობლიობა (ბიტი ბადე), დაყოფილია ცალკეულ ველებად: რიცხვის ნიშნის ველი, რიცხვის მოდულის ველი, მანტისას ველი, რიგის მოდულის ველი და ა.შ. ველების ციფრების დასანომრად, მიმდევრობა გამოიყენება რიცხვები, ნულიდან დაწყებული (0, 1, 2, 3, ...).

ხელმოუწერელი მთელი რიცხვები.

მონაცემთა ეს ტიპი გამოიყენება ნულოვანი და დადებითი მთელი რიცხვების წარმოსადგენად.

ნახ. 2.3.1 და მოცემულია 8-ბიტიანი მთელი რიცხვების ფორმატები. ნიშნის ბიტი არ არის, ამიტომ რიცხვების დიაპაზონი არის 0…2

ორობითი კოდის ბიტის სიღრმე იგივეა, რაც ნომრის ბიტის სიგანე.

ხელმოწერილი მთელი რიცხვები.

ორი დადებითი რიცხვის A და B გამოკლების ოპერაცია შეიძლება ჩაითვალოს სხვადასხვა ნიშნის მქონე რიცხვების ალგებრული შეკრების ოპერაციად: A – B = A + (–

). მაშასადამე, გამოკლების არითმეტიკული მოქმედების ალგებრული შეკრების ოპერაციით ჩასანაცვლებლად, საჭიროა როგორმე გამოვსახოთ რიცხვის ნიშანი. როგორც წესი, დამატებითი ბიტი გამოიყოფა ორობითი რიცხვის ნიშნისთვის. რიცხვის ნიშანი მითითებულია ყველაზე მნიშვნელოვან ციფრში: 0 შეესაბამება რიცხვის დადებით ნიშანს "+", 1 - უარყოფით ნიშანს "–".

ხელმოწერილი რიცხვების წარმოსაჩენად იგი ფართოდ გამოიყენება დამატებითიკოდი.

მთელი რიცხვების წარმოდგენა დადებითიბინარული რიცხვები

– ბიტის კომპლემენტის კოდში ყველა ყველაზე მნიშვნელოვანი ბიტი (ნიშნის ბიტის ჩათვლით) უნდა იყოს შევსებული ნულებით.

პრეზენტაციისთვის უარყოფითისაჭირო ნომრები:

● რიცხვის ყველა მნიშვნელოვანი ციფრული ციფრის (მოდული) ინვერსია;

● მიღებულ მნიშვნელობას დაამატეთ ერთი;

● შეავსეთ ყველა ყველაზე მნიშვნელოვანი ციფრი (მათ შორის, ნიშნის ციფრები).

მაგალითად, 8-ბიტიანი ორის დამატებითი კოდი დადებითი რიცხვისთვის +6 არის 00000110, ხოლო უარყოფითი რიცხვისთვის 6 - 11111010.

ნახ. 2.3.1, b გვიჩვენებს 8-ბიტიანი ხელმოწერილი რიცხვების ფორმატებს ორი კომპლემენტის კოდში. მათი წარმოდგენის დიაპაზონი არის – 2 (

–1) - რიცხვის მნიშვნელოვანი ნაწილის ციფრის მოცულობა. თანამედროვე მიკროპროცესორებიმხარს უჭერს 16, 32 და 64 ბიტიან მთელ რიცხვებს. არსებობს ორი ხშირად გამოყენებული მთელი რიცხვის ფორმატი: მოკლეციფრების რაოდენობით

და გრძელი 2 ციფრის რაოდენობით

გაანგარიშების პროცესში გამოიყენება გრძელი ფორმატი, შედეგები ნაჩვენებია მოკლე ფორმატში. თუ რიცხვის მოდულის მნიშვნელოვანი ციფრების რაოდენობა აღემატება (

– 1), ბიტიანი ბადე გადაედინება, რაც იწვევს რიცხვის წარმოდგენის შეცდომას მოდულის ყველაზე მნიშვნელოვანი ბიტების დაკარგვის გამო. არითმეტიკული მოქმედებების შესრულების შემდეგ, დიაპაზონიდან გასვლის შედეგი აღინიშნება გადინების დროშის O-ზე დაყენებით.

ფიქსირებული პუნქტების ნომრები.

რეალური რიცხვების წარმოდგენის ბუნებრივ ფორმაში წერტილის (მძიმით) პოზიცია ფიქსირდება რიცხვის მთელ და წილად ნაწილებს შორის. რეალურ რიცხვში წერტილის პოზიციის შესაცვლელად, საჭიროა შევიტანოთ მასშტაბის კოეფიციენტი, რომლის მნიშვნელობა უნდა შეირჩეს ისე, რომ მნიშვნელობა უცვლელი იყოს. ნამდვილი რიცხვი. ხშირად წერტილი ფიქსირდება რიცხვის მოდულის ყველაზე მნიშვნელოვანი ციფრების წინ. ამ შემთხვევაში A რიცხვის წარმოდგენას ფიქსირებული წერტილით აქვს ფორმა სათანადო წილადი, რომელიც შეესაბამება მდგომარეობას

რიცხვის მნიშვნელოვანი ციფრების არჩეული რაოდენობა.

პირობა (2.3.2) უნდა დაკმაყოფილდეს პრობლემის საწყისი მონაცემებისა და გამოთვლების ყველა შუალედური შედეგისთვის, რაც უზრუნველყოფილია მასშტაბის ფაქტორის K არჩევით.

თუ პირობა (2.3.2) დარღვეულია, А Ф რიცხვს აქვს მთელი ნაწილი, რომელიც იკარგება, რადგან ის არ ხვდება ბიტთა ბადეში გადასვლის გამო. მაშასადამე, მასშტაბის K კოეფიციენტის დადგენისას უნდა გამოვიდეს ამოცანის ამოხსნაში ჩართული რიცხვების მოდულის მაქსიმალური მნიშვნელობიდან K> | A |

მაშინ პირობა (2.3.2) შესრულდება А Ф = А/К-სთვის.

ნახ. 2.3.2 და მოცემულია ფორმატი კომპიუტერული წარმოდგენა AF ნომრები ფიქსირებული წერტილით. როდესაც ნომერი AF შეიყვანება მეხსიერების უჯრედში, ბიტთა ბადის თავისუფალი დაბალი რიგის ციფრები ივსება ნულებით. თუ ნომერი

მოდულის მნიშვნელოვანი ციფრები |

– 1, შემდეგ მოდულის დაბალი რიგის ბიტები, რომლებიც არ ჯდება

– ბიტიანი ბადე, დაკარგულია. ეს იწვევს შეცდომას, რომლის აბსოლუტური მნიშვნელობა ნაკლებია ბიტის ბადის ერთ-ერთ ყველაზე ნაკლებად მნიშვნელოვან ციფრზე, ე.ი.

32 აბსოლუტური შეცდომა

0,5×10 – 30x0,3 = 0,5×10 – 9

მიეცეს ორი რიცხვი A = –1010.101 2 და B = +10.10101 2, რისთვისაც |

აქედან გამომდინარე, მასშტაბის ფაქტორი K > |

2 4 = 10000 2. სიმძლავრე 4 მიუთითებს ორიგინალური რიცხვების 4 ციფრით მარჯვნივ გადატანის აუცილებლობაზე

მართლა

A.K= –1010.101. 10000 =

–0.1010101 2 ;

V F = V. K = 10.10101. 10000 = 0.001010101 2 . А Ф და В Ф რიცხვების წარმოდგენის ფორმატები ნაჩვენებია ნახ. 2.3.2.6, გ. VF რიცხვის კომპიუტერული წარმოდგენის სიზუსტის შესანარჩუნებლად, საჭიროა ბიტის ბადის გაფართოება 10 ბიტამდე.

რიცხვების ფიქსირებული წერტილის სახით წარმოდგენის ერთ-ერთი უპირატესობა არის არითმეტიკული მოქმედებების შესრულების სიმარტივე. მინუსები არის ის, რომ:

● აუცილებელია მასშტაბის ფაქტორების შერჩევა;

● მოდულის ყველაზე მნიშვნელოვან ბიტებში ნულები იწვევს რიცხვის მოდულის მნიშვნელოვანი ნაწილის მიერ დაკავებული ბიტების რაოდენობის შემცირებას. შედეგად, მცირე მოდულის მნიშვნელობებით რიცხვების წარმოდგენის სიზუსტე მცირდება.

ლოგიკური ტიპები.

ლოგიკური მნიშვნელობები ხელმოუწერელია და გამოიყენება ლოგიკურ ოპერაციებში

და ა.შ. ოპერაცია ხორციელდება ცალკეულ ბიტებზე. ლოგიკური ოპერანდები დამუშავებულია ნაწილებად, თუ მათი ბიტის მოცულობა აღემატება პროცესორის ბიტის მოცულობას.

ორობითი ათობითი მთელი რიცხვები.

IN Ყოველდღიური ცხოვრებისხალხი იყენებს ათობითი რიცხვების სისტემას. ათობითი რიცხვების შესანახად და დასამუშავებლად ციფრული მოწყობილობებიისინი წარმოდგენილია ორობითი კოდით. Შესრულება ათობითი რიცხვი, რომელშიც ყოველი ათობითი ციფრი წარმოდგენილია ორობითი სიმბოლოების სახით 0 და 1, ეწოდება BCD. ანბანიდან მოყოლებული ათობითი სისტემაშედგება 10 ციფრისგან; ყველაზე ხშირად გამოყენებული არის 4-ბიტიანი სიტყვა, რომელსაც ეწოდება ტეტრადი ან ნიბლი. ტეტრადების გამოყენებით, საჭირო 10-ის ნაცვლად, შეგიძლიათ მიიღოთ 0 და 1 კომბინირებული სიმბოლოების 2 4 = 16 სხვადასხვა კომბინაცია. ორობითი ათობითი კოდირებით, სხვადასხვა ათობითი ციფრი უნდა შეესაბამებოდეს O და 1 სიმბოლოების სხვადასხვა კომბინაციებს, ანუ მხოლოდ 10 კომბინაციას. ნებადართულია 16 ნებადართული და აკრძალული კომბინაციების ხელმისაწვდომობა - მნიშვნელოვანი ქონებაორობითი ათობითი კოდები. ეს თვისება განასხვავებს მათ ჩვეულებრივისგან პოზიციონირების სისტემებინომრები, რომლებშიც ნებადართულია ყველა კომბინაცია. სხვადასხვა ნებადართული 4-ბიტიანი კოდების (ტეტრადების) ჯამური რაოდენობა, რომელიც განისაზღვრება 10-ის 16 ელემენტის კომბინაციით, არის: C 10 16 = 18008. ეგრეთ წოდებული კოდი 8421, რომელიც იყენებს ბინარული რიცხვების პირველ ათეულს. 0000 (0 10), ფართოდ გამოიყენება 1001-მდე (9 10).

4-ნიშნა კოდების უპირატესობა ის არის, რომ ათობითი რიცხვების კოდირებისას გამოიყენება მინიმალური თანხაგამონადენები. დამატებითი მე-5 ციფრის შემოღება საშუალებას გაძლევთ აღმოაჩინოთ შეცდომები გადაცემის დროს რიცხვითი ინფორმაციასაკომუნიკაციო ხაზებზე ჩარევის არსებობისას. მაგალითად, 5-ბიტიან კოდში 2 5-დან, ყველა კოდის კომბინაცია შეიცავს ორ ერთს და სამ ნულს. ამიტომ, ნებისმიერი ციფრის შეცვლა (საპირისპირო მნიშვნელობამდე) გამოიწვევს კოდის აკრძალულ კომბინაციას.

ნახ. 2.3.3 გვიჩვენებს ორობითი ათობითი რიცხვის ფორმატს, რომელიც შეიცავს 18 ტეტრადს (

0) და ნიშნის ბიტი

(მაღალი ბაიტის დარჩენილი ბიტები დაყენებულია ნულოვანი მნიშვნელობებით). თითოეულ ტეტრადას შეესაბამება ერთი ათობითი ადგილი.

მცურავი წერტილის რიცხვები.

ხშირ შემთხვევაში, გამოთვლების განსახორციელებლად აუცილებელია ნომრების წარდგენა მაღალი სიზუსტითფართო არჩევანიღირებულებები. აკმაყოფილებს მითითებულ მოთხოვნებს ნორმალური ფორმანომრები (2.3.1). მისი გამოყენების თავისებურებების იდენტიფიცირება მცურავი პუნქტიანი რიცხვების წარმოდგენისთვის ციფრული სისტემებიჩვენ ვივარაუდებთ, რომ:

● მანტისას დაწერა, (

1) – ბინის ორობითი კოდი, უმაღლესი თანმიმდევრობით (

–ე) ციფრი განსაზღვრავს მანტისას ნიშანს (რიცხვი), დარჩენილი ციფრები განსაზღვრავს მანტისას მოდულს. მანტისას მოდულის მნიშვნელობა |M|< 1, что соот-ветствует фиксации точки перед значащими цифрами (разрядами) модуля мантиссы;

● შეკვეთის ჩასაწერად გამოიყენება P, (p + 1)-ბიტიანი ორობითი კოდი, სადაც ყველაზე მნიშვნელოვანი (p-th) ციფრი განსაზღვრავს წესრიგის ნიშანს, დარჩენილი ციფრები განსაზღვრავს შეკვეთის მოდულს. რიგი P (მთელი რიცხვი) მიუთითებს რიცხვში წერტილის ფაქტობრივ პოზიციაზე.

ნახ. 2.3.4 და მოცემულია მცურავი პუნქტის ნომრის ფორმატი.

რიცხვის წარმოდგენის სიზუსტე (2.3.1) დამოკიდებულია მანტისას მნიშვნელოვანი ციფრების (ციფრების) რაოდენობაზე. სიზუსტის გასაზრდელად, მცურავი წერტილის რიცხვები წარმოდგენილია ნორმალიზებული ფორმით, რაც მითითებულია თანდასწრებით მნიშვნელოვანი ფიგურა(ერთეული ამისთვის

2) მანტისას მოდულის ყველაზე მნიშვნელოვან ციფრში. ნორმალიზებული მანტისას მოდულის მნიშვნელობა at

2 დევს 2 –1 ≤ |M|-ის ფარგლებში< 1 (для любых порядков П). В нормализованной форме могут быть представлены все числа из некоторого диапазона за исключением нуля.

მოდით წარმოვადგინოთ იგი მცურავი წერტილის ფორმატში ბინარული რიცხვები A = +10010.10101 და B = –111.0101. დავწეროთ A და B ნორმალიზებული ფორმით

A = +0.1001010101. 2 5, V= –0.1110101000. 2–3.

(2.3.4) საფუძველზე ვწერთ mantissa |M-ის მოდულებს

| = 1001010101 2 , |მ

| = 1110101000 2 და შეკვეთის მოდულები ბინარული სისტემაგაანგარიშება |P A | = 5 10 = 0101 2 , |P

| = 3 10 = 0011 2 . აირჩიეთ ბიტის ბადის ციფრების მთლიანი რაოდენობა

P = 16. ჩვენ ვიღებთ ციფრთა რაოდენობას მანტისას მოდულისთვის, როგორც 10, რიგის მოდულისთვის, როგორც 4.

A და B რიცხვების ფორმატები ნაჩვენებია ნახ. 2.3.4, 6, გ. მანტისა და B ოპერანდის რიგი, რომლებსაც აქვთ უარყოფითი მნიშვნელობა, წარმოდგენილია დამატებითი კოდი:

|# + 1 = 0001010111 + 1 = 0001011110;

|# + 1 = 0011 + 1 = 0100, სადაც # არის ინვერსია.

ვინაიდან აბსოლუტური შეცდომა მცურავი პუნქტიანი რიცხვების წარმოდგენისას დამოკიდებულია P-ის რიგითობაზე, ჩვენ მივცემთ ფარდობითი შეცდომის შეფასებას:

/ 2 –1 = 2 –(

მოდულის წარმოდგენის აბსოლუტური შეცდომა

- ბიტი მანტისა; |

22 –1 - მანტისას ნორმალიზებული მოდულის მინიმალური მნიშვნელობა.

გაითვალისწინეთ, რომ სტანდარტში

754/854 იყენებს ბრძანებას P = P – E სახით, სადაც E =

შეკვეთის ოფსეტური; P max = 2E. ამან მოგვცა საშუალება გამოგვერიცხა მოედანი

შეკვეთის შესვლა ნომრის წარმოდგენის ფორმატში.

ძველად, IT ინდუსტრიისთვის ეს გასული საუკუნის 70-იანი წლები იყო, მათემატიკოსები (როგორც ადრე ეძახდნენ პროგრამისტებს) დონ კიხოტის მსგავსად იბრძოდნენ. უთანასწორო ბრძოლაკომპიუტერებით, რომლებიც მაშინ პატარა ქარის წისქვილების ზომის იყო. ამოცანები სერიოზული იყო: ოკეანეში მტრის წყალქვეშა ნავების ძებნა ორბიტიდან ფოტოების გამოყენებით, შორი დისტანციის რაკეტების ბალისტიკის გამოთვლა და ა.შ. მათ გადასაჭრელად კომპიუტერმა უნდა იმუშაოს რეალური რიცხვებით, რომლებიც, როგორც ვიცით, კონტინუუმია, ხოლო მეხსიერება სასრულია. მაშასადამე, ჩვენ უნდა დავაფიქსიროთ ეს კონტინუუმი ნულებისა და ერთების სასრულ სიმრავლეზე. სიჩქარის, ზომისა და წარმოდგენის სიზუსტეს შორის კომპრომისის მოსაძებნად, მეცნიერებმა შესთავაზეს მცურავი წერტილის რიცხვები (ან მცურავი წერტილი, თუ ბურჟუაზიაში).

მცურავი წერტილის არითმეტიკა რატომღაც განიხილება კომპიუტერული მეცნიერების ეგზოტიკურ სფეროდ, იმის გათვალისწინებით, რომ მონაცემთა შესაბამისი ტიპები წარმოდგენილია ყველა პროგრამირების ენაში. მართალი გითხრათ, კომპიუტერულ არითმეტიკას არასდროს ვანიჭებდი დიდ მნიშვნელობას, მაშინ როცა იგივე პრობლემის გადაჭრა CPU-ზე და GPU-ზე მივიღე. განსხვავებული შედეგი. აღმოჩნდა, რომ ამ ტერიტორიის საიდუმლო კუთხეებში იმალება ძალიან კურიოზული და უცნაური ფენომენები: არითმეტიკული მოქმედებების არაკომუტატიურობა და ასოციაციურობა, ნული ნიშნით, არათანაბარი რიცხვების სხვაობა იძლევა ნულს და ა.შ. ამ აისბერგის ფესვები ღრმად შედის მათემატიკაში და ჭრილის ქვეშ შევეცდები გამოვკვეთო მხოლოდ ის, რაც ზედაპირზე დევს.

1. საფუძვლები

მთელი რიცხვების სიმრავლე უსასრულოა, მაგრამ ჩვენ ყოველთვის შეგვიძლია ავირჩიოთ რამდენიმე ბიტი, რათა წარმოვადგინოთ ნებისმიერი მთელი რიცხვი, რომელიც წარმოიქმნება ამოხსნის დროს. კონკრეტული დავალება. ნამდვილ რიცხვთა სიმრავლე არა მხოლოდ უსასრულოა, არამედ უწყვეტია, ამიტომ რამდენი ბიტიც არ უნდა ავიღოთ, აუცილებლად შევხვდებით რიცხვებს, რომლებსაც ზუსტი წარმოდგენა არ აქვთ. მცურავი წერტილის რიცხვები ერთ-ერთია შესაძლო გზებირეალური რიცხვების წარმოდგენა, რომელიც წარმოადგენს კომპრომისს სიზუსტესა და მიღებული მნიშვნელობების დიაპაზონს შორის.

მცურავი წერტილის რიცხვი შედგება ცალკეული ციფრების ნაკრებისგან, რომლებიც პირობითად იყოფა ნიშნად, მაჩვენებლად და მანტისად. მაჩვენებელი და მანტისა არის მთელი რიცხვები, რომლებიც ნიშანთან ერთად იძლევა მცურავი წერტილის რიცხვის წარმოდგენას შემდეგი ფორმა:

მათემატიკურად ასე წერია:

(-1) s × M × B E, სადაც s არის ნიშანი, B არის რადიქსი, E არის მაჩვენებელი და M არის მანტისა.

ბაზა განსაზღვრავს ციფრული რიცხვების სისტემას. მათემატიკურად დადასტურდა, რომ მცურავი წერტილიანი რიცხვები ფუძით B=2 ( ორობითი წარმოდგენა) ყველაზე მდგრადია დამრგვალების შეცდომებზე, ამიტომ პრაქტიკაში გვხვდება მხოლოდ 2 და ნაკლებად ხშირად 10 საფუძვლები შემდგომი წარმოდგენისთვის ყოველთვის ვივარაუდებთ B = 2 და მცურავი პუნქტის ფორმულა ასე გამოიყურება.

(-1) s × M × 2 E

რა არის მანტისა და წესრიგი? მანტისაარის ფიქსირებული სიგრძის მთელი რიცხვი, რომელიც წარმოადგენს ყველაზე მნიშვნელოვან ბიტებს ნამდვილი რიცხვი. ვთქვათ, ჩვენი მანტისა შედგება სამი ბიტისაგან (|M|=3). აიღეთ, მაგალითად, რიცხვი "5", რომელიც ბინარულ სისტემაში იქნება 101 2-ის ტოლი. ყველაზე მნიშვნელოვანი ბიტი შეესაბამება 2 2 =4, შუა ბიტს (რომელიც გვაქვს ნულის ტოლი) 2 1 =2 და ყველაზე ახალგაზრდა 2 0 =1. შეკვეთა- ეს არის უმაღლესი ციფრის ფუძის (ორი) ხარისხი. ჩვენს შემთხვევაში E=2. მოსახერხებელია ასეთი რიცხვების დაწერა ე.წ. სტანდარტული ფორმა, მაგალითად "1.01e+2". მაშინვე ირკვევა, რომ მანტისა სამი ნიშნისგან შედგება, რიგი კი ორია.

ვთქვათ, გვინდა მივიღოთ წილადი რიცხვი, მანტისას იგივე 3 ბიტის გამოყენებით. ჩვენ შეგვიძლია ამის გაკეთება, თუ ავიღებთ, ვთქვათ, E=1. მაშინ ჩვენი რიცხვი ტოლი იქნება

1.01e+1 = 1×2 1 +0×2 0 +1×2 -1 =2+0.5=2.5

აქ, რადგან E=1, პირველი ციფრიდან ორის (რომელიც ათწილადის წერტილამდე მოდის) ძალა არის "1". დანარჩენი ორი ციფრი, რომელიც მდებარეობს მარჯვნივ (ათწილადის წერტილის შემდეგ) იძლევა 2 E-1 და 2 E-2 (2 0 და 2 -1, შესაბამისად). აშკარაა, რომ E-ს კორექტირებით ერთი და იგივე რიცხვი შეიძლება სხვადასხვანაირად იყოს წარმოდგენილი. განვიხილოთ მაგალითი მანტისას სიგრძით |M|=4. რიცხვი "2" შეიძლება წარმოდგენილი იყოს შემდეგნაირად:

2 = 10 (ორობითად) = 1.000e+1 = 0.100e+2 = 0.010e+3. (E=1, E=2, E=3 შესაბამისად)

გთხოვთ გაითვალისწინოთ, რომ ერთსა და იმავე რიცხვს აქვს მრავალი წარმოდგენა. ეს არ არის მოსახერხებელი ტექნიკისთვის, რადგან ... რიცხვების შედარებისას და მათზე არითმეტიკული მოქმედებების შესრულებისას აუცილებელია გამოსახვის სიმრავლის გათვალისწინება. უფრო მეტიც, ეს არ არის ეკონომიური, რადგან წარმოდგენების რაოდენობა სასრულია, ხოლო გამეორება ამცირებს იმ რიცხვების რაოდენობას, რომლებიც საერთოდ შეიძლება იყოს წარმოდგენილი. ამიტომ, უკვე პირველ მანქანებში მათ დაიწყეს ხრიკის გამოყენება, რაც მანტისას პირველ ნაწილს ყოველთვის პოზიტიურად აქცევს. ეს პრეზენტაცია ე.წ ნორმალიზებული.

ეს ინახავს ერთ ბიტს, რადგან ნაგულისხმევი არ საჭიროებს მეხსიერებაში შენახვას და უზრუნველყოფს რიცხვის ცალსახად წარმოჩენას. ჩვენს მაგალითში "2"-ს აქვს ერთი ნორმალიზებული წარმოდგენა ("1.000e+1"), ხოლო მანტისა ინახება მეხსიერებაში, როგორც "000", რადგან წამყვანი ერთეული იგულისხმება იმპლიციტურად. მაგრამ რიცხვების ნორმალიზებული წარმოდგენისას ჩნდება ახალი პრობლემა- ამ ფორმით ნულის წარმოდგენა შეუძლებელია.

მკაცრად რომ ვთქვათ, ნორმალიზებულ რიცხვს აქვს შემდეგი ფორმა:

(-1) s × 1.M × 2 E.

პრობლემის გადაჭრის ხარისხი დიდწილად დამოკიდებულია მცურავი წერტილის წარმოდგენის არჩევანზე. ჩვენ თანდათან მივუახლოვდით ასეთი წარმომადგენლობის სტანდარტიზაციის პრობლემას.

2. პატარა ისტორია

60-იან და 70-იან წლებში არ არსებობდა ერთიანი სტანდარტი მცურავი წერტილის რიცხვების, დამრგვალების მეთოდების ან არითმეტიკული მოქმედებების წარმოდგენისთვის. შედეგად, პროგრამები უკიდურესად არაპორტატული იყო. Მაგრამ ასევე უფრო დიდი პრობლემაჰქონდა რა სხვადასხვა კომპიუტერებიიყო რაღაც „უცნაურობები“ და ისინი უნდა ყოფილიყო ცნობილი და გათვალისწინებული გადაცემაში. მაგალითად, ორი არათანაბარი რიცხვის სხვაობამ დააბრუნა ნული. შედეგად, გამოთქმები „X=Y“ და „X-Y=0“ კონფლიქტში მოვიდა. ხელოსნები ამ პრობლემას ძალიან ჭკვიანური ხრიკებით გადაჭრიდნენ, მაგალითად, გამრავლებისა და გაყოფის ოპერაციების წინ აკეთებდნენ დავალებას „X=(X-X)+X“, რათა თავიდან აიცილონ პრობლემები.

მცურავი წერტილის რიცხვების წარმოდგენის ერთიანი სტანდარტის შექმნის ინიციატივა საეჭვოდ დაემთხვა Intel-ის მცდელობებს 1976 წელს შეემუშავებინა „უკეთესი“ არითმეტიკა ახალი 8086 და i432 კოპროცესორებისთვის. განვითარება ამ დარგის მეცნიერებმა, პროფ. ჯონ პალმერი და უილიამ კაჰანი. ამ უკანასკნელმა ინტერვიუში გამოთქვა მოსაზრება, რომ სერიოზულობამ, რომლითაც Intel-მა განავითარა არითმეტიკა, აიძულა სხვა კომპანიები გაერთიანდნენ და დაეწყოთ სტანდარტიზაციის პროცესი.

ყველა სერიოზული იყო, რადგან ძალიან მომგებიანია თქვენი არქიტექტურის პოპულარიზაცია და მისი სტანდარტირება. DEC-მა, National Superconductor-მა, Zilog-მა და Motorola-მ წარმოადგინეს თავიანთი წინადადებები. Mainframe-ის შემქმნელები Cray და IBM უყურებდნენ გვერდიდან. ინტელის კომპანიარა თქმა უნდა, მისი ახალი არითმეტიკაც წარმოადგინა. შემოთავაზებული სპეციფიკაციის ავტორები იყვნენ უილიამ კაჰანი, ჯერომი კუნენი და ჰაროლდ სტოუნი და მათ წინადადებას მაშინვე ეწოდა მეტსახელი "K-C-S".

თითქმის მაშინვე, ყველა წინადადება, გარდა ორისა, უარყოფილ იქნა: VAX DEC-დან და "K-C-S" Intel-ისგან. VAX სპეციფიკაცია ბევრად უფრო მარტივი იყო, ის უკვე დანერგილი იყო PDP-11 კომპიუტერებში და გასაგები იყო, თუ როგორ უნდა მიიღოთ მაქსიმალური შესრულება. მეორეს მხრივ, "K-C-S" შეიცავდა უამრავ სასარგებლო ფუნქციას, როგორიცაა "სპეციალური" და "დენორმალიზებული" ნომრები (დეტალები ქვემოთ).

ყველაფერი K-C-S-ში არითმეტიკული ალგორითმებიმკაცრად არის დაკონკრეტებული და აუცილებელია, რომ განხორციელების შედეგი ემთხვეოდეს მათ. ეს საშუალებას იძლევა მკაცრი გამოთვლების გაკეთება ამ სპეციფიკაციის ფარგლებში. თუ ადრე მათემატიკოსი წყვეტდა პრობლემას რიცხვითი მეთოდების გამოყენებით და დაამტკიცებდა ამონახსნის თვისებებს, არ არსებობდა გარანტია, რომ ეს თვისებები შენარჩუნდებოდა პროგრამაში. K-C-S არითმეტიკის სიმკაცრემ შესაძლებელი გახადა თეორემების დამტკიცება მცურავი წერტილის არითმეტიკის გამოყენებით.

საოლქო საარჩევნო კომისიამ ყველაფერი გააკეთა იმისთვის, რომ მისი სპეციფიკაცია სტანდარტად აქციოს. მან ზოგიერთი ცნობილი მეცნიერის მხარდაჭერაც კი მოიპოვა, რომ K-C-S არითმეტიკას პრინციპში არ შეეძლო იგივე შედეგის მიღწევა, როგორც DEC. ირონია ის არის, რომ Intel-მა იცოდა, თუ როგორ უნდა გამოეყენებინა თავისი სპეციფიკა, როგორც შესრულება, მაგრამ ეს ხრიკები სავაჭრო საიდუმლო იყო. Intel რომ არ დანებებულიყო და არ გაემხილა მისი ზოგიერთი საიდუმლო, ის ვერ შეაკავებდა DEC-ის შემოტევას.

სტანდარტიზაციის ბრძოლების შესახებ მეტი ინფორმაციისთვის იხილეთ პროფესორ კაჰანის ინტერვიუ და ჩვენ გადავხედავთ, როგორ გამოიყურება ახლა მცურავი წერტილის წარმოდგენა.

3. მცურავი პუნქტიანი რიცხვების წარმოდგენა დღეს

K-C-S დეველოპერებმა გაიმარჯვეს და ახლა მათი აზროვნება გახდა IEEE754 სტანდარტი. იგი წარმოადგენს მცურავი წერტილის რიცხვებს, როგორც ნიშნებს (s), მანტისას (M) და მაჩვენებელს (E) შემდეგნაირად:

(-1)s × 1.M × 2 E

კომენტარი.ახალ IEE754-2008 სტანდარტში, 2-იანი ფუძის მქონე რიცხვების გარდა, არის 10 ფუძის მქონე რიცხვები, ე.წ. ათობითი(ათწილადი) მცურავი პუნქტიანი რიცხვები.

იმისათვის, რომ მკითხველი არ გადაიტვირთოს ვიკიპედიაში არსებული გადაჭარბებული ინფორმაციით, განვიხილავთ მხოლოდ ერთ მონაცემთა ტიპს, ერთ სიზუსტეს (float). ნახევარი, ორმაგი და გაფართოებული სიზუსტის რიცხვებს აქვთ იგივე მახასიათებლები, მაგრამ აქვთ განსხვავებული რიგი და მანტისა. ერთჯერადი სიზუსტის რიცხვებში (float/single) ბრძანება შედგება 8 ბიტისაგან, ხოლო მანტისა - 23-ისგან. ეფექტური ბრძანება განისაზღვრება როგორც E-127. მაგალითად, ნომერი 0.15625 შეინახება მეხსიერებაში როგორც

სურათი გადაღებულია ვიკიპედიიდან

ამ მაგალითში:

  • ნიშანი s=0 (დადებითი ნომერი)
  • შეკვეთა E=01111100 2 -127 10 = -3
  • Mantissa M = 1.01 2 (პირველი ერთეული არ არის აშკარა)
  • შედეგად, ჩვენი რიცხვი F = 1.01 2 e-3 = 2 -3 +2 -5 = 0.125 + 0.03125 = 0.15625

ცოტა უფრო დეტალური ახსნა

აქ საქმე გვაქვს რიცხვის „101“ ორობით გამოსახვასთან, სადაც ათწილადი რამდენიმე ადგილით მარცხნივ გადაადგილებულია. 1.01 არის ორობითი წარმოდგენა, რაც ნიშნავს 1×2 0 + 0×2 -1 + 1×2 -2. ათობითი წერტილის სამი პოზიციით მარცხნივ გადაადგილებით მივიღებთ 1.01e-3 = 1×2 -3 + 0×2 -4 + 1×2 -5 = 1×0.125 + 0×0.0625 + 1×0.03125 = 0.125 + 0. 03125 = 0.15625.

3.1 სპეციალური რიცხვები: ნული, უსასრულობა და გაურკვევლობა
IEEE754-ში რიცხვი "0" წარმოდგენილია მნიშვნელობით E=E min -1-ის ტოლი რიგით (სინგლისთვის ეს არის -127) და ნულოვანი მანტისა. ნულის დამოუკიდებელ რიცხვად შემოღებამ (რადგან ნულის ნორმალიზებულ წარმოდგენაში ვერ იქნება წარმოდგენილი) შესაძლებელი გახადა არითმეტიკაში მრავალი უცნაურობის თავიდან აცილება. და მიუხედავად იმისა, რომ ოპერაციები ნულთან ერთად უნდა დამუშავდეს ცალკე, ისინი ჩვეულებრივ უფრო სწრაფად სრულდება, ვიდრე ჩვეულებრივი რიცხვებით.

IEEE754 ასევე გთავაზობთ წარმომადგენლობას სპეციალური ნომრები, რომელთანაც მუშაობა იწვევს გამონაკლისს. ეს რიცხვები მოიცავს უსასრულობას (±∞) და გაურკვევლობას (NaN). ეს რიცხვები საშუალებას გაძლევთ დააბრუნოთ ადეკვატური მნიშვნელობა გადასვლის შემთხვევაში. უსასრულობები წარმოდგენილია რიცხვების სახით E=E max +1 და ნულოვანი მანტისა. თქვენ შეგიძლიათ მიიღოთ უსასრულობა ზედმეტად და გაყოფით არა ნულოვანი რიცხვინულამდე. დეველოპერებმა განსაზღვრეს უსასრულობა გაყოფაში, ლიმიტების არსებობის საფუძველზე, როდესაც დივიდენდი და გამყოფი მიდრეკილია გარკვეულ რიცხვზე. შესაბამისად, c/0==±∞ (მაგალითად, 3/0=+∞, და -3/0=-∞), ვინაიდან თუ დივიდენდი მიდრეკილია მუდმივისკენ და გამყოფი მიდრეკილია ნულისკენ, ზღვარი უდრის უსასრულობა. 0/0-ზე არ არის ლიმიტი, ამიტომ შედეგი იქნება გაურკვევლობა.

გაურკვევლობაან NaN (არა რიცხვიდან) არის გამოსახულება, რომელიც გამოიგონეს იმისათვის არითმეტიკული ოპერაციაყოველთვის შეუძლია დააბრუნოს რაიმე უაზრო მნიშვნელობა. IEEE754-ში NaN წარმოდგენილია როგორც რიცხვი, რომელშიც E=E max +1 და მანტისა არ არის ნულოვანი. ნებისმიერი ოპერაცია NaN-ით აბრუნებს NaN-ს. თუ სასურველია, შეგიძლიათ მანტისაში ჩაწეროთ ინფორმაცია, რომლის ინტერპრეტაციაც პროგრამას შეუძლია. ეს არ არის მითითებული სტანდარტით და მანტისას ყველაზე ხშირად უგულებელყოფენ.

როგორ შეგიძლიათ მიიღოთ NaN? ერთ-ერთი შემდეგი გზით:

  • ∞+(- ∞)
  • 0 × ∞
  • 0/0, ∞/∞
  • sqrt(x), სადაც x<0
განმარტებით, NaN ≠ NaN, ამიტომ, ცვლადის მნიშვნელობის შესამოწმებლად, თქვენ უბრალოდ უნდა შეადაროთ იგი საკუთარ თავს.
რატომ აქვს ნულს ნიშანი (ან +0 vs -0)
ცნობისმოყვარე მკითხველმა ალბათ უკვე შეამჩნია, რომ მცურავი პუნქტიანი რიცხვების აღწერილ წარმოდგენაში არის ორი ნული, რომლებიც განსხვავდება მხოლოდ ნიშნით. ასე რომ, 3·(+0)=+0 და 3·(-0)=-0. მაგრამ როცა შევადარებთ +0=-0. სტანდარტში ნიშანი შენახული იყო შეგნებულად ისე, რომ გამონათქვამები, რომლებიც გადადინების ან დაქვეითების შედეგად გადაიქცევა უსასრულობაში ან ნულში, მაინც წარმოადგენდა ყველაზე სწორ შედეგს გამრავლებისა და გაყოფისას. მაგალითად, თუ ნულს არ აქვს ნიშანი, გამოხატულება 1/(1/x)=x არ იქნება მართალი x=±∞-ზე, რადგან 1/∞ და 1/-∞ 0-ის ტოლია.

კიდევ ერთი მაგალითი:
(+∞/0) + ∞ = +∞, ხოლო (+∞/-0) +∞ = NaN

რატომ არის უსასრულობა ამ შემთხვევაში NaN-ზე უკეთესი? იმის გამო, რომ თუ NaN გამოჩნდება არითმეტიკულ გამოსახულებაში, მთელი გამოხატვის შედეგი ყოველთვის იქნება NaN. თუ გამოსახულებაში გვხვდება უსასრულობა, მაშინ შედეგი შეიძლება იყოს ნული, უსასრულობა ან ჩვეულებრივი მცურავი წერტილის რიცხვი. მაგალითად, 1/∞=0.

3.3 დენორმალიზებული რიცხვები
მოდით შევხედოთ რა სუბნორმალურ დენორმალიზებულ რიცხვებს იყენებენ მარტივი მაგალითის გამოყენებით. მოდით გვქონდეს ნორმალიზებული წარმოდგენა მანტისის სიგრძით |M|=2 ბიტი (+ ერთი ბიტი ნორმალიზება) და მნიშვნელობების დიაპაზონი -1≤E≤2. ამ შემთხვევაში მივიღებთ 16 რიცხვს:

დიდი შტრიხები აჩვენებს ციფრებს მანტისით ტოლი 1.00. ჩანს, რომ მანძილი ნულიდან უახლოეს რიცხვამდე (0 - 0.5) მეტია, ვიდრე ამ რიცხვიდან შემდეგამდე (0.5 - 0.625). ეს ნიშნავს, რომ სხვაობა ნებისმიერ ორ რიცხვს შორის 0,5-დან 1-მდე მისცემს 0-ს, თუნდაც ეს რიცხვები არ იყოს ტოლი. კიდევ უფრო უარესი ის არის, რომ 1-ზე მეტ რიცხვებს შორის სხვაობა 0.5-სა და 0-ს შორის ხვდება. მაგალითად, „1.5-1.25=0“ (იხ. სურათი).

ყველა პროგრამა არ ხვდება "თითქმის ნულოვანი ხვრელში". 70-იანი წლების სტატისტიკის მიხედვით, საშუალოდ, ყოველ კომპიუტერს თვეში ერთხელ აწყდებოდა ეს პრობლემა. იმის გათვალისწინებით, რომ კომპიუტერები ფართოდ გავრცელდა, K-C-S დეველოპერებმა მიიჩნიეს ეს პრობლემა საკმარისად სერიოზული გადასაჭრელად ტექნიკის დონეზე. მათ მიერ შემოთავაზებული გამოსავალი ასეთი იყო. ჩვენ ვიცით, რომ E=E min -1 (მოცურვისთვის ეს არის „-127“) და ნულოვანი მანტისა, რიცხვი ითვლება ნულის ტოლად. თუ მანტისა არ არის ნული, მაშინ რიცხვი ჩაითვლება არა ნულად, მისი რიგი დაყენებულია E=E min , ხოლო მანტისას იმპლიციტური მაღალი ბიტი დაყენებულია ნულზე. ასეთ ნომრებს ეძახიან დენორმალიზებული.

მკაცრად რომ ვთქვათ, მცურავი წერტილის რიცხვები ახლა ასე გამოიყურება:

(-1) s × 1.M × 2 E თუ E min ≤E≤E max (ნორმალიზებული რიცხვები)

(-1) s × 0.M × 2 Emin თუ E=E min -1. (დენორმალიზებული რიცხვები)

დავუბრუნდეთ მაგალითს. ჩვენი E min =-1. შემოვიღოთ ახალი რიგის მნიშვნელობა, E=-2, რომლის დროსაც რიცხვები დენორმალიზებულია. შედეგად, ჩვენ ვიღებთ რიცხვების ახალ წარმოდგენას:

0-დან 0,5-მდე ინტერვალი ივსება დენორმალიზებული რიცხვებით, რაც შესაძლებელს ხდის არ ჩავარდეს ზემოთ განხილულ 0 მაგალითში (0,5-0,25 და 1,5-1,25). ამან წარმოდგენა უფრო მძლავრი გახადა ნულთან მიახლოებული რიცხვების დამრგვალების შეცდომებისთვის.

მაგრამ პროცესორში რიცხვების დენორმალიზებული წარმოდგენის გამოყენების ფუფუნება არ მოდის უფასოდ. იმის გამო, რომ ყველა არითმეტიკული მოქმედებისას ასეთი რიცხვები სხვაგვარად უნდა იქნას დამუშავებული, ძნელია ასეთი არითმეტიკის ეფექტურად მუშაობა. ეს დამატებით სირთულეებს აჩენს პროცესორში ALU-ების დანერგვისას. და მიუხედავად იმისა, რომ დენორმალიზებული რიცხვები ძალიან სასარგებლოა, ისინი არ არიან პანაცეა და ნულამდე დამრგვალება მაინც საჭიროებს ზრუნვას. ამიტომ, ეს ფუნქციონირება გახდა დაბრკოლება სტანდარტის შემუშავების დროს და შეხვდა უძლიერეს წინააღმდეგობას.

3.4 ნომრის შეკვეთა IEEE754-ში
IEEE754 რიცხვის წარმოდგენის ერთ-ერთი საოცარი თვისება ის არის, რომ მაჩვენებლები და მანტისა ერთმანეთის მიყოლებით განლაგებულია ისე, რომ ისინი ერთად ქმნიან მთელი რიცხვების (n) თანმიმდევრობას, რომლისთვისაც მოქმედებს შემდეგი:

ასე რომ, თუ ავიღებთ დადებით მცურავი წერტილის რიცხვს, გადავიყვანთ მთელ რიცხვად, დავამატებთ "1", მივიღებთ შემდეგ რიცხვს, რომელიც გამოსახულია ამ არითმეტიკაში. C-ში შეგიძლიათ გააკეთოთ ეს ასე:

ათწილადი a=0.5; int n = *((int*) &a); float b = *((float*) &(++n)); printf("%e-ს შემდეგ შემდეგი რიცხვი: %e, სხვაობა (%e)\n", a, b, b-a);
ეს კოდი იმუშავებს მხოლოდ 32-ბიტიან ინტ არქიტექტურაზე.

4. ხარვეზები მცურავი წერტილის არითმეტიკაში

ახლა - პრაქტიკაში. მოდით შევხედოთ მცურავი წერტილის არითმეტიკის მახასიათებლებს, რომლებიც განსაკუთრებულ ყურადღებას მოითხოვს პროგრამირებისას.
4.1 დამრგვალება
დამრგვალების შეცდომების გამო შეცდომები რთულია თანამედროვე მცურავი წერტილის არითმეტიკაში, განსაკუთრებით ორმაგი სიზუსტის გამოყენებისას. დამრგვალების წესი IEEE754 სტანდარტში წერს, რომ ნებისმიერი არითმეტიკული მოქმედების შედეგი უნდა იყოს ისეთი, თითქოს იგი შესრულდა ზუსტ მნიშვნელობებზე და დამრგვალებული იყოს ამ ფორმატში წარმოდგენილ უახლოეს რიცხვამდე. ეს მოითხოვს დამატებით ძალისხმევას ALU-სგან და კომპილერის ზოგიერთ ვარიანტს (როგორიცაა "-fast-math" gcc-ში) შეუძლია გამორთოს ეს ქცევა. IEEE754 დამრგვალების მახასიათებლები:
  • სტანდარტში უახლოესამდე დამრგვალება განსხვავებულად ხდება, ვიდრე ჩვენ მიჩვეულები ვართ. მათემატიკურად ნაჩვენებია, რომ თუ 0.5 დამრგვალებულია 1-მდე (ზემოთ), მაშინ არის ოპერაციების ნაკრები, რომელშიც დამრგვალების შეცდომა უსასრულობამდე გაიზრდება. ამიტომ, IEEE754 იყენებს წესს მრგვალი ლუწამდე. ასე რომ, 12.5 დამრგვალდება 12-მდე, ხოლო 13.5 დამრგვალდება 14-მდე.
  • მცურავი წერტილის არითმეტიკაში დამრგვალების თვალსაზრისით ყველაზე საშიში ოპერაცია არის გამოკლება. ახლო რიცხვების გამოკლებისას შეიძლება მნიშვნელოვანი ციფრები დაიკარგოს, რაც
    შეიძლება რამდენჯერმე გაზარდოს შედარებითი შეცდომა.
  • ბევრი ფართოდ გამოყენებული მათემატიკური ფორმულისთვის მათემატიკოსებმა შეიმუშავეს სპეციალური ფორმა, რომელსაც შეუძლია მნიშვნელოვნად შეამციროს დამრგვალების შეცდომები. მაგალითად, უმჯობესია გამოვთვალოთ ფორმულა "x 2 -y 2" ფორმულის გამოყენებით "(x-y) (x+y)".
4.2 არითმეტიკული მოქმედებების არაასოციაციურობა
მცურავი წერტილის არითმეტიკაში წესი (a*b)*c = a*(b*c) არ მოქმედებს არც ერთი არითმეტიკული მოქმედებისთვის. Მაგალითად,

(10 20 +1)-10 20 =0 ≠ (10 20 -10 20)+1=1

ვთქვათ, გვაქვს რიცხვების შეჯამების პროგრამა.

ორმაგი s = 0.0; for (int i=0; i ზოგიერთმა შემდგენელმა შეიძლება ნაგულისხმევად გადაწეროს კოდი, რათა გამოიყენოს რამდენიმე ALU ერთდროულად (თუ ვივარაუდებთ, რომ n იყოფა 2-ზე):

ორმაგი სა, ს; sa=sa=0.0; for (int i=0; i ვინაიდან ჯამის ოპერაციები არ არის ასოციაციური, ორმა პროგრამამ შეიძლება გამოიწვიოს განსხვავებული შედეგი.

4.3 რიცხვითი მუდმივები
გახსოვდეთ, რომ ყველა ათობითი რიცხვს არ აქვს ორობითი მცურავი წერტილის წარმოდგენა. მაგალითად, რიცხვი "0.2" წარმოდგენილი იქნება როგორც "0.200000003" ერთი სიზუსტით. შესაბამისად, "0.2 + 0.2 ≈ 0.4." აბსოლუტური შეცდომა ინდივიდში
ამ შემთხვევაში ის შეიძლება არ იყოს მაღალი, მაგრამ თუ ასეთ მუდმივას გამოვიყენებთ ციკლში, შეიძლება მივიღოთ დაგროვილი შეცდომა.
4.4 მინიმუმ ორი მნიშვნელობის არჩევა
ვთქვათ, ჩვენ უნდა ავირჩიოთ მინიმუმ ორი მნიშვნელობა. C-ში ეს შეიძლება გაკეთდეს ერთ-ერთი შემდეგი გზით:
  1. x< y? x: y
  2. x<= y? x: y
  3. x > y? y:x
  4. x >= y? y:x
ხშირად შემდგენელი თვლის მათ ექვივალენტად და ყოველთვის იყენებს პირველ ვარიანტს, რადგან ის შესრულებულია ერთი პროცესორის ინსტრუქციაში. მაგრამ თუ გავითვალისწინებთ ±0 და NaN-ს, ეს ოპერაციები არანაირად არ არის ექვივალენტური:
x x< y? x: y x<= y? x: y x > y? y: x x >= y? y:x
+0 -0 -0 +0 +0 -0
NaN 1 1 1 NaN NaN
4.5 რიცხვთა შედარება
ძალიან გავრცელებული შეცდომა ფლოტებთან მუშაობისას ხდება თანასწორობის შემოწმებისას. Მაგალითად,

Float fValue = 0.2; if (fValue == 0.2) DoStuff();
შეცდომა აქ არის, ჯერ ერთი, რომ 0.2-ს არ აქვს ზუსტი ორობითი წარმოდგენა და მეორეც, 0.2 არის ორმაგი სიზუსტის მუდმივი და fValue ცვლადი არის ერთჯერადი და არ არსებობს გარანტია ამ შედარების ქცევის შესახებ.

საუკეთესო, მაგრამ მაინც მცდარი გზაა განსხვავების შედარება დასაშვებ აბსოლუტურ შეცდომასთან:

თუ (fabs (fValue – fExpected)< 0.0001) DoStuff(); // fValue=fExpected?

ამ მიდგომის მინუსი ის არის, რომ რიცხვის წარმოდგენის შეცდომა იზრდება, როგორც თავად რიცხვი იზრდება. ასე რომ, თუ პროგრამა ელოდება „10000“-ს, მაშინ ზემოაღნიშნული თანასწორობა არ იქნება უახლოეს მეზობელ რიცხვზე (10000.000977). ეს განსაკუთრებით ეხება იმ შემთხვევაში, თუ პროგრამა შეიცავს კონვერტაციას ერთიდან ორმაგ სიზუსტით.

სწორი შედარების პროცედურის არჩევა რთულია და დაინტერესებულ მკითხველებს მივმართავ ბრიუს დოუსონის სტატიას. იგი გვთავაზობს მცურავი წერტილის რიცხვების შედარებას მათი მთელი რიცხვის ცვლადად გარდაქმნით. ეს არის საუკეთესო, თუმცა არა პორტატული გზა:

Bool AlmostEqual2sComplement(float A, float B, int maxUlps) ( // maxUlps არ უნდა იყოს უარყოფითი და არც ისე დიდი ისე, რომ // NaN არ იყოს ტოლი ნებისმიერი რიცხვის მტკიცებით (maxUlps > 0 && maxUlps< 4 * 1024 * 1024); int aInt = *(int*)&A; // Уберем знак в aInt, если есть, чтобы получить правильно упорядоченную последовательность if (aInt < 0) aInt = 0x80000000 - aInt; //aInt &= 0x7fffffff; //(см. комментарий пользователя Vayun) // Аналогично для bInt int bInt = *(int*)&B; if (bInt < 0) bInt = 0x80000000 - bInt; /*aInt &= 0x7fffffff;*/ unsigned int intDiff = abs(aInt - bInt); /*(см. комментарий пользователя Vayun)*/ if (intDiff <= maxUlps) return true; return false; }

ამ პროგრამაში maxUlps (Units-In-Last-Place-დან) არის მცურავი პუნქტიანი რიცხვების მაქსიმალური რაოდენობა, რომელიც შეიძლება მდებარეობდეს შესამოწმებელ მნიშვნელობასა და მოსალოდნელ მნიშვნელობას შორის. ამ ცვლადის კიდევ ერთი მნიშვნელობა არის ორობითი ციფრების რაოდენობა (დაწყებული ყველაზე ნაკლებად მნიშვნელოვანი) შედარებულ რიცხვებში, რომელთა გამოტოვებაც დაშვებულია. მაგალითად, maxUlps=16 ნიშნავს, რომ ქვედა 4 ბიტი (log 2 16) შეიძლება არ ემთხვეოდეს, მაგრამ რიცხვები მაინც ტოლი იქნება. ამ შემთხვევაში 10000 რიცხვთან შედარებისას აბსოლუტური ცდომილება იქნება 0.0146-ის ტოლი, ხოლო 0.001-თან შედარებით შეცდომა იქნება 0.00000001-ზე ნაკლები (10 -8).

5. IEE754 მხარდაჭერის სისრულის შემოწმება

როგორ ფიქრობთ, თუ პროცესორები სრულად შეესაბამება IEEE754 სტანდარტს, მაშინ ნებისმიერი პროგრამა, რომელიც იყენებს მონაცემთა სტანდარტულ ტიპებს (როგორიცაა float/double in C) ერთსა და იმავე შედეგს გამოიღებს სხვადასხვა კომპიუტერზე? ცდებით. პორტაბელურობაზე და სტანდარტთან შესაბამისობაზე გავლენას ახდენს შემდგენელი და ოპტიმიზაციის პარამეტრები. უილიამ კაჰანმა დაწერა პროგრამა C-ზე (არსებობს ასევე Fortran-ის ვერსია), რომელიც საშუალებას გაძლევთ შეამოწმოთ, აკმაყოფილებს თუ არა კომბინაცია "არქიტექტურა + შემდგენელი + ოფციები" IEEE754. მას ჰქვია "მცურავი წერტილის პარანოია" და მისი საწყისი ტექსტები ხელმისაწვდომია ჩამოსატვირთად. მსგავსი პროგრამა ხელმისაწვდომია GPU-სთვის. მაგალითად, Intel Compiler (icc) ნაგულისხმევად იყენებს "მოდუნებულ" IEEE754 მოდელს და შედეგად, ყველა ტესტი არ გადის. "-fp-model ზუსტი" ოფცია საშუალებას გაძლევთ შეადგინოთ პროგრამა ზუსტად სტანდარტზე. GCC შემდგენელს აქვს "-fast-math" ვარიანტი, რომელიც იწვევს IEEE754 შეუსაბამობას.

დასკვნა

და ბოლოს, სასწავლო ამბავი. როცა GPU-ზე სატესტო პროექტზე ვმუშაობდი, მქონდა იგივე პროგრამის სერიული და პარალელური ვერსია. შესრულების დროის შედარების შემდეგ ძალიან გამიხარდა, რადგან მივიღე 300x სისწრაფე. მაგრამ მოგვიანებით გაირკვა, რომ GPU-ზე გამოთვლები "დაიშალა" და გადაიქცა NaN-ზე და მათთან მუშაობა GPU-ში უფრო სწრაფი იყო, ვიდრე ჩვეულებრივი რიცხვებით. საინტერესო იყო კიდევ ერთი - იგივე პროგრამა GPU-ის ემულატორზე (CPU-ზე) სწორი შედეგი გამოიღო, მაგრამ თავად GPU-ზე არა. მოგვიანებით გაირკვა, რომ პრობლემა ის იყო, რომ ეს GPU სრულად არ უჭერდა მხარს IEEE754 სტანდარტს და პირდაპირი მიდგომა არ მუშაობდა.

მცურავი წერტილის არითმეტიკა ახლა თითქმის სრულყოფილია. თითქმის ყოველთვის, გულუბრყვილო მიდგომა იმუშავებს და პროგრამა, რომელიც არ ითვალისწინებს მის ყველა მახასიათებელს, გამოიღებს სწორ შედეგს, ხოლო აღწერილი ხარვეზები ეხება მხოლოდ ეგზოტიკურ შემთხვევებს. მაგრამ თქვენ ყოველთვის უნდა იყოთ ფხიზლად: ისეთ საკითხში, როგორიც არის კომპიუტერული მათემატიკა, ადვილია გადადგმული ნაბიჯი.
! ტეგების დამატება

არაუარყოფითი მთელი რიცხვის მაქსიმალური მნიშვნელობა მიიღწევა, როდესაც ყველა უჯრედი შეიცავს ერთს. n-ბიტიანი წარმოდგენისთვის ის ტოლი იქნება

არაუარყოფითი მთელი რიცხვები. მინიმალური რიცხვი შეესაბამება მეხსიერების უჯრედის რვა ბიტში შენახულ რვა ნულს და უდრის ნულს. მაქსიმალური რიცხვი შეესაბამება რვა ერთეულს და უდრის

A = 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 1 × 2 8 - 1 = 255 10 .

ცვლილების დიაპაზონი არაუარყოფითი მთელი რიცხვებინომრები: 0-დან 255-მდე.

შესანახად ხელმოწერილი მთელი რიცხვებიგამოყოფილია მეხსიერების ორი უჯრედი (16 ბიტი), ხოლო ყველაზე მნიშვნელოვანი (მარცხენა) ბიტი ენიჭება რიცხვის ნიშანს (თუ რიცხვი დადებითია, მაშინ ნიშნის ბიტზე 0 იწერება, თუ რიცხვი უარყოფითია - 1) .

დადებითი რიცხვების წარმოდგენა კომპიუტერში ნიშნის სიდიდის ფორმატის გამოყენებით ეწოდება პირდაპირი კოდინომრები. მაგალითად, ნომერი 2002 10 = 11111010010 2 წარმოდგენილი იქნება 16-ბიტიან ფორმატში შემდეგნაირად:

0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0

მაქსიმალური დადებითი რიცხვი (თითო ნიშანზე ერთი ციფრის დაშვებით) ხელმოწერილი მთელი რიცხვებისთვის n-ბიტიანი წარმოდგენით არის:

გამოიყენება უარყოფითი რიცხვების წარმოსაჩენად დამატებითი კოდი. დამატებითი კოდი საშუალებას გაძლევთ შეცვალოთ არითმეტიკული გამოკლების ოპერაცია შეკრების ოპერაციით, რაც მნიშვნელოვნად ამარტივებს პროცესორის მუშაობას და ზრდის მის მუშაობას.

n უჯრედში შენახული უარყოფითი A რიცხვის კომპლემენტის კოდი არის 2 n - |A|.

ორის დანამატი წარმოადგენს უარყოფითი რიცხვის A მოდულის დამატებას 0-ზე, ვინაიდან n-ბიტიანი კომპიუტერული არითმეტიკაში:

2 n - |A| + |A| = 0,

ვინაიდან კომპიუტერულ n-ბიტი არითმეტიკაში 2 n = 0. მართლაც, ასეთი რიცხვის ორობითი წარმოდგენა შედგება ერთი და n ნულისაგან და მხოლოდ n დაბალი რიგის ციფრი, ანუ n ნული, შეიძლება მოერგოს n-ბიტს. უჯრედი.

უარყოფითი რიცხვის დამატებითი კოდის მისაღებად, შეგიძლიათ გამოიყენოთ საკმაოდ მარტივი ალგორითმი:

1. ჩაწერეთ ნომრის მოდული პირდაპირი კოდი n ორობითი ციფრით.

2. მიიღეთ დაბრუნების კოდირიცხვები, ამ მნიშვნელობისთვის, შეატრიალეთ ყველა ბიტი (შეცვალეთ ყველა ერთი ნულით და შეცვალეთ ყველა ნული ერთით).

3. დაამატეთ ერთი მიღებულ საპირისპირო კოდს.

მოდით დავწეროთ უარყოფითი რიცხვის დამატებითი კოდი -2002 16-ბიტიანი კომპიუტერის წარმოდგენისთვის:


როდესაც გამოყენებულია უარყოფითი A რიცხვის n-ბიტი გამოსახულება ორი კომპლემენტის კოდში, ყველაზე მნიშვნელოვანი ბიტი გამოიყოფა რიცხვის (ერთის) ნიშნის შესანახად. დარჩენილი ციფრები იწერება როგორც დადებითი რიცხვები.

იმისათვის, რომ რიცხვი იყოს დადებითი, შემდეგი პირობა უნდა იყოს ჭეშმარიტი:

|ა| £ 2 n-1.

მაშასადამე, A რიცხვის მოდულის მაქსიმალური მნიშვნელობა m ციფრულ წარმოდგენაში უდრის:

მაშინ მინიმალური უარყოფითი რიცხვია:

მოდით განვსაზღვროთ რიცხვების დიაპაზონი, რომელიც შეიძლება შეინახოს RAM-ში ფორმატში გრძელი ხელმოწერილი რიცხვები(ასეთი რიცხვების შესანახად გამოყოფილია მეხსიერების ოთხი უჯრედი - 32 ბიტი).

მაქსიმალური დადებითი მთელი რიცხვი (თითო ნიშანზე ერთი ციფრის განაწილების გათვალისწინებით) უდრის:

A = 2 31 - 1 = 2 147 483 647 10.

მინიმალური უარყოფითი მთელი რიცხვი არის:

A = -2 31 = - 2 147 483 648 10.

რიცხვების ფორმატში წარმოდგენის უპირატესობები ფიქსირებული წერტილიარის რიცხვების წარმოდგენის სიმარტივე და სიცხადე, ასევე არითმეტიკული მოქმედებების განხორციელების ალგორითმების სიმარტივე.

რიცხვების ფორმატში წარმოდგენის მინუსი ფიქსირებული წერტილიარის რაოდენობების წარმოდგენის მცირე დიაპაზონი, არასაკმარისი მათემატიკური, ფიზიკური, ეკონომიკური და სხვა ამოცანების გადასაჭრელად, რომელშიც გამოიყენება როგორც ძალიან მცირე, ასევე ძალიან დიდი რიცხვები.

რიცხვების წარმოდგენა მცურავი წერტილის ფორმატში.რეალური რიცხვები ინახება და მუშავდება კომპიუტერში ფორმატში მცურავი წერტილი. ამ შემთხვევაში, რიცხვში ათობითი წერტილის პოზიცია შეიძლება შეიცვალოს.

ნომრის ფორმატი მცურავი წერტილიეფუძნება ექსპონენციალურ აღნიშვნას, რომელშიც ნებისმიერი რიცხვი შეიძლება იყოს წარმოდგენილი. ასე რომ, რიცხვი A შეიძლება წარმოდგენილი იყოს როგორც:

A = m × q n 2.3

სადაც m არის რიცხვის მანტისა;
q - რიცხვითი სისტემის საფუძველი;
n - ნომრის შეკვეთა.

რიცხვების ერთიანი წარმოდგენისთვის მცურავი წერტილიგამოიყენება ნორმალიზებული ფორმა, რომელშიც მანტისა აკმაყოფილებს პირობას:

1/n £ |მ|

ეს ნიშნავს, რომ მანტისა უნდა იყოს სწორი წილადი და არ იყოს ნულოვანი ციფრი ათობითი წერტილის შემდეგ.

გადავიყვანოთ ათწილადი რიცხვი 555.55, დაწერილი ბუნებრივი სახით, ექსპონენციალურ ფორმად ნორმალიზებული მანტისით:

555,55 = 0,55555 × 10 3.

აქ ნორმალიზებული მანტისა არის: m = 0,55555, რიგი: n = 3.

რიცხვი მცურავი წერტილის ფორმატში იღებს 4 ( საერთო სიზუსტის ნომერი) ან 8 ბაიტი ( ორმაგი სიზუსტის ნომერი). მცურავი წერტილის რიცხვის დაწერისას, ბიტები გამოიყოფა მანტისას ნიშნის, მაჩვენებლის ნიშნის, ექსპონენტისა და მანტისას შესანახად.

რიცხვების დიაპაზონი განისაზღვრება ნომრის რიგის შესანახად გამოყოფილი ბიტების რაოდენობით, ხოლო სიზუსტე (მნიშვნელოვანი ციფრების რაოდენობა) განისაზღვრება მანტისას შესანახად გამოყოფილი ბიტების რაოდენობით.

მოდით განვსაზღვროთ მაქსიმალური რაოდენობა და მისი სიზუსტე ფორმატისთვის ჩვეულებრივი ზუსტი ნომრები, თუ 8 ბიტი არის გამოყოფილი შეკვეთისა და მისი ნიშნის შესანახად, ხოლო 24 ბიტი გამოყოფილია მანტისას და მისი ნიშნის შესანახად:

0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
მოაწერე ხელი და შეუკვეთე ნიშანი და მანტისა

ნომრის რიგის მაქსიმალური მნიშვნელობა იქნება 1111111 2 = 127 10 და, შესაბამისად, ნომრის მაქსიმალური მნიშვნელობა იქნება:

2 127 = 1.7014118346046923173168730371588 × 10 38.

დადებითი მანტისას მაქსიმალური მნიშვნელობა არის:

2 23 - 1 » 2 23 = 2 (10 × 2.3) » 1000 2.3 = 10 (3 × 2.3) » 10 7.

ამრიგად, მაქსიმალური მნიშვნელობა ჩვეულებრივი ზუსტი ნომრებიგამოთვლების შესაძლო სიზუსტის გათვალისწინებით იქნება 1.701411 × 10 38 (ათწილადი რიცხვის მნიშვნელოვანი ციფრების რაოდენობა ამ შემთხვევაში შემოიფარგლება 7 ციფრით).

Დავალებები

1.26. შეავსეთ ცხრილი 16-ბიტიან ნოტაციაში უარყოფითი ათობითი რიცხვების ჩაწერით:

1.27. ხედვის დიაპაზონის განსაზღვრა ხელმოწერილი მთელი რიცხვები(გამოყოფილია 2 ბაიტი მეხსიერება) ფიქსირებული წერტილის ფორმატში.

1.28. განსაზღვრეთ მაქსიმალური რაოდენობა და მისი სიზუსტე ფორმატისთვის ორმაგი სიზუსტის რიცხვები, თუ 11 ბიტი არის გამოყოფილი შეკვეთისა და მისი ნიშნის შესანახად, ხოლო 53 ბიტი გამოყოფილია მანტისას და მისი ნიშნის შესანახად.

მომსახურების მიზანი. ონლაინ კალკულატორი შექმნილია რეალური რიცხვების წარმოსაჩენად მცურავი წერტილის ფორმატში.

ნომერი

წარმოდგენილია 10 2 ნომრის სისტემაში.
წარმოადგინეთ ნომერი:
ნორმალიზებული ექსპონენციალური ფორმა
დენორმალიზებული ექსპონენციალური ფორმა
32 ბიტიანი IEEE 754 ფორმატი
64 ბიტიანი IEEE 754 ფორმატი
დააბრუნეთ ათწილადის აღნიშვნა

ნომრების შეყვანის წესები

  1. ათობითი რიცხვების სისტემაში რიცხვები შეიძლება შეიყვანოთ წილადის გარეშე ან წილადი ნაწილით (234234.455).
  2. ორობითი რიცხვების სისტემაში რიცხვები შედგება მხოლოდ ციფრებისგან 0 და 1 (10100.01).
  3. თექვსმეტობით რიცხვთა სისტემაში რიცხვები შედგება ციფრებისგან 0...9 და ასო A...F.
  4. თქვენ ასევე შეგიძლიათ მიიღოთ კოდის საპირისპირო წარმოდგენა (თექვსმეტობითიდან ათწილადამდე, 40B00000)
მაგალითი No1. წარმოადგინეთ რიცხვი 133.54 მცურავი პუნქტის სახით.
გამოსავალი. წარმოვადგენთ რიცხვს 133.54 ნორმალიზებული ექსპონენციალური ფორმით:
1.3354*10 2 = 1.3354* ექსპლუატაცია 10 2
რიცხვი 1.3354*exp 10 2 შედგება ორი ნაწილისგან: მანტისა M=1.3354 და მაჩვენებლის ექსპლუატაცია 10 =2.
თუ მანტისა არის 1 ≤ M დიაპაზონში რიცხვის წარმოდგენა დენორმალიზებული ექსპონენციალური ფორმით.
თუ მანტისა არის 0,1 ≤ M დიაპაზონში, წარმოვადგენთ რიცხვს დენორმალიზებული ექსპონენციალური ფორმით: 0,13354*exp 10 3

მაგალითი No2. წარმოადგინეთ ბინარული რიცხვი 101.10 2 ნორმალიზებული ფორმით, დაწერილი 32-ბიტიანი IEEE754 სტანდარტით.
გამოსავალი.
ბინარული მცურავი წერტილის რიცხვის წარმოდგენა ექსპონენციალური ნორმალიზებული ფორმით.
მოდით გადავიტანოთ ნომერი 2 ციფრი მარჯვნივ. შედეგად, ჩვენ მივიღეთ ექსპონენციალური ნორმალიზებული ორობითი რიცხვის ძირითადი კომპონენტები:
მანტისა M=1.011
მაჩვენებლის ექსპლუატაცია 2 =2
გადაიყვანეთ ორობითი ნორმალიზებული რიცხვი 32-ბიტიან IEEE 754 ფორმატში.
პირველი ბიტი გამოყოფილია რიცხვის ნიშნის აღსანიშნავად. ვინაიდან რიცხვი დადებითია, პირველი ბიტი არის 0
შემდეგი 8 ბიტი (მე-2-დან მე-9-მდე) დაცულია მაჩვენებლისთვის.
მაჩვენებლის ნიშნის დასადგენად, რათა თავიდან იქნას აცილებული სხვა ნიშნის ბიტის შემოღება, დაამატეთ ოფსეტი ნახევარ ბაიტის მაჩვენებელს +127. ასე რომ, ჩვენი მაჩვენებელია: 2 + 127 = 129
გადავიყვანოთ მაჩვენებლის ორობითი წარმოდგენა.
დარჩენილი 23 ბიტი დაცულია მანტისისთვის. ნორმალიზებულ ბინარულ მანტისაში, პირველი ბიტი ყოველთვის 1-ის ტოლია, რადგან რიცხვი 1 ≤ M დიაპაზონშია მთელი რიცხვის ნაწილის გადასაყვანად, თქვენ უნდა გაამრავლოთ რიცხვის ციფრი შესაბამისი ციფრის სიმძლავრეზე.
01100000000000000000000 = 2 22 *0 + 2 21 *1 + 2 20 *1 + 2 19 *0 + 2 18 *0 + 2 17 *0 + 2 16 *0 + 2 15 *0 + 2 14 *0 + 2 13 *0 + 2 12 *0 + 2 11 *0 + 2 10 *0 + 2 9 *0 + 2 8 *0 + 2 7 *0 + 2 6 *0 + 2 5 *0 + 2 4 *0 + 2 3 *0 + 2 2 *0 + 2 1 *0 + 2 0 *0 = 0 + 2097152 + 1048576 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = 3145728
ათობითი კოდში მანტისა გამოიხატება როგორც 3145728
შედეგად, რიცხვი 101.10 წარმოდგენილია IEEE 754-ში ერთი სიზუსტით ტოლია.
გადავიყვანოთ თექვსმეტობით გამოსახულებად.
მოდით გავყოთ საწყისი კოდი 4 ბიტიან ჯგუფებად.
2 = 0100 0000 1011 0000 0000 0000 0000 0000 2
ჩვენ ვიღებთ ნომერს:
0100 0000 1011 0000 0000 0000 0000 0000 2 = 40B00000 16



გაქვთ შეკითხვები?

შეატყობინეთ შეცდომას

ტექსტი, რომელიც გაეგზავნება ჩვენს რედაქტორებს: