Skip to main content

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

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

int abs( int value ) {
        if( value < 0 )
                 return -value;
        return value;


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

int abs( int value ) {
        const int mask = value >> (sizeof(int)<<3-1);
        return (value^mask) - mask;
}

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

Comments

  1. ra enazea es? sizeof(int) tu 2 ia(ishviati shemtxveva) undefined behaviour ikneba C/C++ ze. http://stackoverflow.com/questions/7401888/why-doesnt-left-bit-shift-for-32-bit-integers-work-as-expected-when-used

    ReplyDelete
    Replies
    1. (sizeof(int)<<3-1) მოგვცემს 15 როცა int-ის ზომა 2ია და 31-ს როცა 4-ია.
      ეს არის უბრალოდ იმისთვის რომ ბოლო ბიტს მივწვდეთ. პრობლემა რომელიც შენ დალინზე ხდება როდესაც წაძვრას ტიპის სიგრძეზე მეტად აკეთებ და არ იცი გარედან 0-ს შემოიტანს თუ 1-ს. მაგ დროს თავი უნდა დაიზღვიო ხოლმე.
      ნებისმიერ შემთხვევაში აქ არის კონცეპტი ნაჩვენები ამ მიდგომის.

      Delete

Post a Comment

Popular posts from this blog

რუსული რულეტკის მეთოდი

Russian Roulette Technique რუსული რულეტკის მეთოდი არის ფართოდ გავრცელებული ტექნიკა მონტე-კარლოს ინტეგრირების პროცესის შესაწყვეტად(სახელწოდება მოდის ცნობილი რუსული თამაშიდან). იმის მაგივრად, რომ პროცესი შევწყვითოთ ხისტად, მაგალითად შერჩევების რაოდენობის რაიმე მაქსიმალურ რაოდენობაზე, რუსული რულექტკის მეთოდი გვეხმარება ინტეგრირების პროცესის მიუკერძოვებლად შეწყვეტაში. მთავარი იდეა რუსული რულეტკის მეთოდისა არის ის, რომ რუსული რულეტკა წყვეტს მონტე კარლოს მეთოდს რაიმე არანულოვანი p ალბათობით(ალბათობა შეიზლება შეირჩეს ერთხელ ან მონტე კარლოს მეთოდის ყოველ ბიჯზე სათითაოდ რაიმე მნიშვნელოვნობით) ან აგრძელებს მას და შემდგომი პროცესიდან მიღებულ შედეგს ამრავლებს 1/p - ზე. რადგან რუსული რულეტკის მეთოდი პროცესის შეწყვეტას ახდენს რაიმე არანულოვანი p ალბათობით ყოველთვის რჩება იმის შანსი, რომ პროცესი გაგრძელდეს რაც იმას ნიშნავს, რომ მონტე კარლოს ინტეგრირების პროცესისათვის ნებისმიერი სიღრმე მიღწევადი ხდება. სწორედ ამიტომ ხისტი შეზღუდვით მიღებული მიკერძოება( სისტემატიური შეცდომა ) ქრება რუსული რ...

ფერების RGB მოდელი

RGB Color Model         ფერების RGB მოდელი წარმოადგენს ისეთ მოდელს რომელშიც სამი ძრირითადი ფერის წითელი, მწვანე და ლურჯის საშუალებით მიიღება ფერების ფართო სპექტრი. მისი დასახელებაც მოდის სწორედ ძირითადი ფერების ინგლისური სახელწოდების ინიციალებიდან(Red, Green, Blue).         ფერთა სპექტრის ამდაგვარი წარმოდგენა დაკავშირებულია იმასთან, რომ გამოსახულების გამოტანის მოწყობილობებში რომელიც გააჩნიათ კომპიუტერებს, ტელევიზორებს ფერის მიღება ფიზიკურად ხდება სწორედ ამ სამი ძირითადი ფერის შეზავებით. დღესდღეობით ყველაზე გავრცელებული არის 24 ბიტიანი RGB მოდელი, სადაც თითოეულ კომპონენტს ეთმობა ერთი ბაიტი და შესაბამისად შეუძლია მიიღოს ნებისმიერი მნიშვნელობა [0, 255] დიაპაზონში, რაც საბოლოოდ გვაძლევს 16777216 განსხვავებულ ფერს.

სინათლის ხილული სპექტრი და სხივის თვისებები

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