سؤال

قل لدي تعويم في حدود [0، 1] وأريد قياسها وتخزينها في بايت غير موقعة. يبدو وكأنه عدم التفكير، ولكن في الواقع، إنه معقد للغاية:

الحل الواضح يبدو وكأنه هذا:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f);
}

هذا يعمل حتى الآن أحصل على جميع الأرقام من 0 إلى 255، لكن توزيع الأعداد الصحيحة ليست كذلك. تعود الوظيفة فقط 255 إذا كان الأمر بالضبط 1.0f. وبعد ليس حلا جيدا.

إذا قمت بالتوليد المناسب، فأنا أتحول المشكلة:

unsigned char QuantizeFloat(float a)
{
  return (unsigned char)(a * 255.0f + 0.5f);
}

هنا النتيجة 0 يغطي فقط نصف المدى العائم من أي رقم آخر.

كيف يمكنني القيام كمياتية بتوزيع متساو من نطاق النقطة العائمة؟ من الناحية المثالية، أود الحصول على توزيع متساوي عن الأعداد الصحيحة إذا قمت بتشويه العوامات العشوائية الموزعة على قدم المساواة.

أيه أفكار؟


راجع للشغل: أيضا الرمز الخاص بي في C المشكلة هي اللغة الأذرية. للأشخاص غير C: افترض ذلك float ل int التحويل باقتطاع تعويم.

تعديل: نظرا لأن لدينا بعض الارتباك هنا: أحتاج إلى رسم خرائط أن خرائط أصغر الإدخال تعويم (0) إلى أصغر سحر غير موقعة، وأعلى تعويم من مجموعتي (1.0F) إلى أعلى البايت غير الموقعة (255).

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

المحلول

ماذا عن a * 256f مع شيك للحد من 256 إلى 255؟ لذلك مثل شيء:

return (unsigned char) (min(255, (int) (a * 256f)));

(للحصول على وظيفة دقيقة مناسبة على منصة - لا أستطيع أن أتذكر وظيفة C لذلك.)

أساسا تريد تقسيم النطاق إلى 256 أجزاء متساوية، وهو ما يجب القيام به. حالة الحافة ل 1.0 الذهاب إلى 256 وتتطلب التقريب أسفل فقط لأن المجال شامل في كلا الطرفين.

نصائح أخرى

أعتقد أن ما تبحث عنه هو:

unsigned char QuantizeFloat (float a)
{
  return (unsigned char) (a * 256.0f);
}

هذا سوف خريطة القيم العوامة الموحدة في [0، 1] إلى قيم بايت موحدة في [0، 255]. جميع القيم في [I / 256، (i + 1) / 256 [(أي استبعاد (I + 1) / 256)، لأنني في 0..255، يتم تعيينها إلى i. ما قد يكون غير مرغوب فيه هو أن 1.0F تم تعيينه إلى 256.0f الذي يلتف إلى 0.

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