لماذا أنا "أضعاف" مجموعة من الاعداد الصحيحه في نصف حجم دون فقدان المعلومات ؟

StackOverflow https://stackoverflow.com/questions/1404316

سؤال

أنا أحاول أن أفهم ورقة عن ضياع ضغط أرقام النقطة العائمة و علقت على واحد معين الخطوة حيث الكتاب خريطة صحيح وقعت من طائفة معينة في طائفة من نصف حجم فقدان المعلومات التي أعتقد هو مطلوب.لدي شعور أن المؤلفين باستخدام بعض المعايير التقنية التي من الواضح جدا أن جمهورها أنها لا يكلف نفسه عناء الشرح ولكن الذي مبهمة تماما بالنسبة لي.

القيمة التي يتم "طي" هو الفرق بين اثنين من 23 بت الأعداد الصحيحة الموجبة (في mantissas من المتوقعة و الفعلية قيمة النقطة العائمة) التي تقع بين 1 - 223 و 223 - 1.الكتاب نقل الأرقام مع أعلى القيم (سلبية وإيجابية) "الداخل" مما النطاق هو نصف حجم كل رقم (باستثناء 0) خرائط القيم الممكنة اثنين من النطاق الأصلي.هذا يجعلني أتساءل كيف العملية ينبغي أن يكون من أي وقت مضى عكس لتحديد القيمة الأصلية.في المؤلفين الكلمات الخاصة:

نحن حساب وقعت مصحح هذا هو أقصر مودولو 223 وعدد k التي تحدد أشد الفاصل (1-2k , 2k) أي مصحح السقوط.بجانب هذا العدد k, الذي يتراوح بين 0 إلى 22 مضغوط [...].أخيرا k + 1 بت الهامة من مصحح المضغوطة.

شبة الكود هذا هو:

void comp mantissa(int expo, int a, int p) {
  // c will be within [1-2^23 ... 2^23 -1]
  int c = a - p;
  // wrap c into [1-2^22 ... 2^22 ]
  if (c <= -(1<<22)) c += 1<<23;
  else if (c > (1<<22)) c -= 1<<23;
  // find tightest [1-2^k ... 2^k ] containing c
  int k = 0;
  // loop could be replaced with faster code
  int c1 = (c < 0 ? -c : c);
  while (c1) { c1 = c1 >> 1; k++ }
  // adjust k for case that c is exactly 2k
  if (k && (c == 1<<(k-1))) k--;

  // .. further code omitted for brevity
}

تجاهل الفعلية وسيلة ضغط ، الناتج يتكون من c و k.ما لا أفهمه هو: كيف يمكنني استعادة الأصلي c من c و k عندما "التفاف ج في" جزء أعلاه فقط خرائط نصف إمكانات واسعة على النصف الآخر ؟ حاولت هذا على الورق مع 4 بدلا من 23 بت و أنا فقط لا تحصل عليه.

هل كانت مفيدة؟

المحلول

عندما يقول الكاتب انهم يدرسون significands "مودولو 2^23", هذا يعني أن الأرقام التي سيتم تخزينها في 23 بت الاعداد الصحيحه ، حتى الأرقام التي تختلف من مضاعفات 2^23 سيكون "نفس" منذ نمط بت هو نفسه.(انظر http://mathworld.wolfram.com/ModularArithmetic.html)

منذ "التفاف" كود بعد c=a-p فقط يضيف أو ينقص 2^23 ج ، عندما كنت في وقت لاحق عكس ذلك من خلال الحوسبة a = c+p يمكنك الحصول على الحق في قيمة 2^23 لا يهم.

هنا مثال الثنائية...

a =             00000000000000000000001
p =             10000000000000000000100
c = a-p =      -10000000000000000000011

منذ ذلك الحين c<=-(1<<22) من التفاف يحدث...

c = c+(1<<23) = 11111111111111111111101

ثم ترميز.ثم في وقت لاحق, يمكنك الحصول على العودة من ج ، ص:

a = c+p =      100000000000000000000001

ولكن لأن هذا هو تخزينها في 23 بت عدد صحيح ، وهذا يعادل:

a =             00000000000000000000001

الذي هو الأصلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top