দুটিতে একটিতে প্যাক করা ভেক্টর গণিত করা সম্ভব It's এটি কীভাবে কাজ করে তা বর্ণনা করার আগে আমাকে প্রথমে একটি উদাহরণ দেখান:
let a = vec_pack([2,4]);
let b = vec_pack([1,2]);
let c = a+b;
let d = c-b;
let e = d*2;
let f = e/2;
console.log(vec_unpack(c));
console.log(vec_unpack(d));
console.log(vec_unpack(e));
console.log(vec_unpack(f));
if(a === f) console.log("Equality works");
if(a > b) console.log("Y value takes priority");
আমি এই সত্যটি ব্যবহার করছি যে আপনি যদি দুটি সংখ্যার এক্স বার বার শিফট করেন এবং তারপরে তাদের স্থানান্তরিত করার আগে এগুলি যুক্ত বা বিয়োগ করেন তবে আপনি একই ফলাফল পাবেন যেন আপনি তাদের শুরুতে স্থানান্তরিত করেননি। একইভাবে স্কেলার গুণ এবং বিভাগ স্থানান্তরিত মানগুলির জন্য প্রতিসমভাবে কাজ করে।
একটি জাভাস্ক্রিপ্ট নম্বরে পূর্ণসংখ্যার নির্ভুলতার 52 বিট রয়েছে (64 বিট ফ্লোট), তাই আমি একটি সংখ্যাকে তিনি উচ্চতর উপলব্ধ 26 বিটগুলিতে প্যাক করব এবং একটি নিম্নের মধ্যে রাখব। কোডটি কিছুটা আরও অগোছালো হয়ে গেছে কারণ আমি স্বাক্ষরিত সংখ্যাগুলিকে সমর্থন করতে চেয়েছিলাম।
function vec_pack(vec){
return vec[1] * 67108864 + (vec[0] < 0 ? 33554432 | vec[0] : vec[0]);
}
function vec_unpack(number){
switch(((number & 33554432) !== 0) * 1 + (number < 0) * 2){
case(0):
return [(number % 33554432),Math.trunc(number / 67108864)];
break;
case(1):
return [(number % 33554432)-33554432,Math.trunc(number / 67108864)+1];
break;
case(2):
return [(((number+33554432) % 33554432) + 33554432) % 33554432,Math.round(number / 67108864)];
break;
case(3):
return [(number % 33554432),Math.trunc(number / 67108864)];
break;
}
}
এর সাথে আমি দেখতে পাচ্ছি যে এক্স এবং ওয়াইটি + -৩৩ মিলিয়ন পরিসরে থাকতে হবে, যেহেতু তাদের প্রতিটি বিট ২ 26 বিটের মধ্যে ফিট করতে হয়।