هل من الممكن تقديم صور واقعية دون أرقام النقطة العائمة؟

مقدمة




"ماذا يحدث إذا استبدلنا أرقام الفاصلة العائمة بأرقام منطقية وحاولنا تقديم الصورة؟"

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

أدى هذا إلى ظهور الفكرة في داخلي - إذا افترضنا أن جميع بيانات العارض الواردة (إحداثيات الرأس ، التحويلات ثلاثية الأبعاد ، إلخ) قد تم تعيينها كأرقام عقلانية ، فسوف تقوم بإنشاء جميع العمليات ، من إنشاء شعاع ، اجتياز الهيكل المتسارع إلى التقاطع الأشعة مع المثلثات هي أرقام عقلانية فقط؟ إذا كان هذا هو الحال ، فسنكون قادرين على إجراء اختبار توحيد الخلايا تمامًا! قد تتساءل لماذا يجب أن يعطي المشهد ثلاثي الأبعاد المعبّر عنه بأرقام منطقية النتائج في أرقام عقلانية فقط ...


مشهد بسيط ، تتبع المسار الذي يتم تنفيذه بواسطة الحساب المنطقي. يستخدم نظام أرقام الفاصلة العائمة ، وليس رقم الفاصلة العائمة.

أولاً ، الرقم المنطقي هو رقم يمكن التعبير عنه كنسبة عدد صحيحين ، على سبيل المثال 1/2 أو 355/113. ثانياً ، "عمليات التقديم العادية" ، مثل اختبارات الصندوق المحيط ، والتحقق من تقاطع الشعاع مع مثلث ، وانعكاس الأشعة ، وما إلى ذلك ، تستند إلى ناقلات ومنتجات العددية ، وكذلك تقسيم العددية (ويشمل ذلك إحداثيات التحويل وانقلاب المصفوفة ، الأرباع ، إلخ) ، والتي بدورها تستند إلى أربع عمليات أساسية: الجمع والطرح والضرب والقسمة. عند إضافة الأرقام المنطقية وطرحها وضربها وتقسيمها ، يتم الحصول على الأرقام المنطقية أيضًا. قد يقول عالم الرياضيات إن العديد من الأرقام المنطقية تشكل حقلًا مغلقًا في إطار أربع عمليات حسابية أساسية. بالنسبة لنا ، هذا يعني أننا إذا التزمنا بأرقام عقلانية حصرية ، فيمكننا بالفعل الانتقال من بيانات إدخال المشهد ثلاثي الأبعاد إلى صورة تم تقديمها بالكامل دون مغادرة عالم الأرقام المنطقية.

استثناءات القاعدة "الإجراءات على الأرقام المنطقية تعطي الأرقام المنطقية" هي جذور مربعة ووظائف مثلثية / متجاوزة. بالنسبة إلى الأخير ، أقول دائمًا أنه إذا كان عليك إجراء حسابات مثلثية في المناطق الداخلية الهندسية لجهاز العارض الخاص بك ، فمن الأرجح أنك تفعل شيئًا خاطئًا (وأظهرت كيفية إصلاح معظم الحالات القياسية ) [ الترجمة على هابري]. بالنسبة للجذور المربعة ، باستثناء الأجزاء المخروطية (الكرات ، الأسطوانات ، إلخ) وإجراء التظليل / DFOS / تلوين ، ليس من الضروري تطبيع الأشعة وتطبيعها بشكل طبيعي على الأسطح كما يحدث عادةً. بالتأكيد لا يلزم القيام به لإنشاء شعاع ، مرورته ، تقاطعها ، انعكاساتها ، إلخ. لسوء الحظ ، غالبًا ما أرى أن المبرمجين يقومون بتطبيع القيم دون سبب آخر بخلاف "جيدًا ، لا أعرف ، أفعل ذلك حتى أتمكن من اللعب بأمان." في الممارسة العملية ، في جزء من التقديم حيث يتم تتبع الهندسة ، نادراً ما يكون من الضروري للغاية تطبيع القيم ، لذلك كان لدي أمل في أن تتمكن من تتبع المشهد بأكمله دون مغادرة عالم الأرقام المنطقية - هذا ما يمكن أن أسميه "العرض المنطقي".

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

هذه المقالة هي قصة عن ليلتين من البحث في واقعية مثل هذه الفكرة. سأتحدث عن العديد من الجوانب التي تعلمتها ، وعن ما توصلت إليه وعن بعض المفاجآت التي اكتشفتها في هذه العملية. تمت كتابة المقال بترتيب زمني أكثر أو أقل من عملي. بالإضافة إلى ذلك ، تمت كتابته بأسلوبي غير الرسمي وغير المألوف للغاية (الذي أفتخر به). الصورة الموضحة أعلاه هي نوع من المفسد ، ولكن اقرأ المقال حتى النهاية ، لأنني سأتحدث عن الخير والشر.

تدريب




أول شيء فعلته هو أن أطبق في Shadertoy تتبعًا محدودًا للغاية لمشهد بسيط للغاية يتكون من طائرة ، كرة ، موازية مستطيلة الشكل ، ومثلث - لبنات بناء العارضين الحقيقيين. ثم قمت بنسخ الكود في ملف C ++ ، وبعد إجراء بعض التغييرات الطفيفة ، قمت بتجميعه باستخدام إطار piLibs الخاص بي. لذلك للمقارنة ، حصلت على صورة تتبع تم تقديمها إلى وحدة المعالجة المركزية باستخدام أرقام منتظمة وفقًا لمعيار IEEE754 بنقطة عائمة. لقد أزلت أيضًا جميع تطبيع الشعاع من شفرة التتبع ، لأنه ، كما ذكر أعلاه ، لا حاجة فعليًا لأي منها. واسمحوا لي أن أذكرك بأن الجذر التربيعي مطلوب للتطبيع ، وأن الأرقام المنطقية لا يتم الاحتفاظ بها عند استخدامه (الجذر التربيعي للرقم الرشيد ليس رقمًا عقلانيًا). بعد قليل سنرى أنه لا يزال من الممكن تطبيق جذور مربعة ، بالطبع ، أردت فقط أن أجعل الكود نظيفًا قدر الإمكان لنرى إلى أي مدى يمكنني أن أذهب مع الحساب الدقيق للأرقام المنطقية دون التقريب.

الخطوة التحضيرية النهائية - أخذت جميع فئات vec3 و mat4x4 وغيرها من فصول الجبر / الرياضيات الأساسية ، ثم غيرتها بحيث استخدموا العقلاني بدلاً من التعويم. نظرًا لأن هيكلي الرشيد يثقل كاهل جميع المشغلين القياسيين (الإضافة ، الفرعية ، mul ، div ، انعكاس الإشارة ، المقارنات ، وما إلى ذلك) ، حدث الاستبدال بدون مشاكل. قمت بسرعة بتنفيذ العمليات المعتادة المتبقية (القيمة المطلقة ، علامة ، وزارة الدفاع ، كسر ، الكلمة ، sqrt ، وما إلى ذلك) ، والتي كانت نظريا كافية للحصول على الاداءات العقلانية الجميلة.

اختبار 1 - الحل ساذج




ولكن دعونا نرى كيف كان هذا التطبيق الأول. في البداية ، أحاول دائمًا أن أبسطها ، ثم أنظر إلى النتائج. وأبسط طريقة لتنفيذ القيم المنطقية كانت استخدام رقمين صحيحين. كما يوحي اسم القسم ، لن يكون هذا قراري النهائي ، ولكن بالنسبة للمحاولة الأولى ، كان قرارًا معقولًا. لذلك ، يجب تمثيل كل رقم x كالبسط N و المقام D ، لتشكيل القيمة N / D. يتم تقريب قيمة x بأفضل زوج N / D ممكن (ضمن عمق البت المحدد) ، وهو الأقرب إلى القيمة x الصحيحة. قررت أن كلا الرقمين يجب أن يكون موجبًا ، ويجب تخزين علامة الرقم في جزء منفصل من أجل تبسيط العمل والتخلص من الغموض ، رغم أن هذا ليس مهمًا جدًا. في هذه المرحلة ، كان كل من البسط والقواسم من النوع غير الموقّع. لكن حتى عند الفصل بين الإشارة ، كان هناك الكثير من التكرار: N / D على سبيل المثال ، يشير 1/4 و 7/28 إلى نفس الرقم ، لكنهما لهما تمثيلات بت مختلفة تمامًا. سنتطرق إلى ذلك لاحقًا ، لكن الآن ، دعونا لا نركز اهتمامنا ونرى كيف تبدو العمليات الحسابية الأساسية الأربع في هذا الشكل العقلاني.

أولاً ، لاحظ أن طرح a - b هو ببساطة إضافة a والقيمة المقابلة لـ b ، أي a + ( -b ) ، حيث يمكن حساب -b ببساطة عن طريق تغيير علامة b . وبالمثل ، فإن تقسيم a / b هو نفس ضرب a و معكوس b . أو بمعنى آخر ، a / b = a · (1 / b ) ، حيث يمكن حساب (1 / b ) ببساطة عن طريق تغيير أماكن البسط b n والمقام b d من الرقم b . لذلك ، هذه هي أول خاصية مثيرة للاهتمام للحساب المنطقي - القسمة والضرب لها نفس التكاليف ، وبالتالي ، على عكس التقسيم العائم المعتاد ، حيث يتم عادةً تجنب الأقسام أو تأخيرها أو إخفاؤها تحت تأخير طلبات الملمس البطيء ، فلا داعي للخوف من هذه العمليات في الحساب المنطقي .

ننتقل إلى الجمع مع الضرب: نحن نعلم أن القيم العكسية والعكسية هي بسيطة للغاية لحساب ، حتى نحصل على:


تعتبر المحافظة على الإشارة أثناء الضرب تافهة ، فهي مجرد xor ، لأن اثنين من القيم الإيجابية تعطي نتيجة إيجابية ، بالإضافة إلى اثنين من القيم السلبية. يعد حفظ علامة للإضافة عملية أكثر تعقيدًا ، ومن أجل حل سريع ، قمت بتنفيذها من خلال ثلاثة فروع (الإضافة تافهة إذا كانت اللافتات أ و ب مطابقة ، ولكن عندما لا تتطابق ، فأنت بحاجة إلى تحديد رقم أصغر وطرحه من الأكبر - في المقال لا سوف أصف هذه التفاصيل الصغيرة بمزيد من التفاصيل ، ولكن فقط ضع الكود المصدري في مكان ما).

سوف أتخطى أيضًا تنفيذ الكسر () والكلمة () ؛ إذا قررت أن تحاول تنفيذها بنفسك ، فسترى بساطتها وجمالها. يجب أيضًا إيلاء الاهتمام لمشغلي المقارنة. بعد الاهتمام بالعلامات والافتراض أن أ و ب موجبة ، نحصل عليها


من المهم أن نلاحظ هنا أنه حتى للمقارنة نحتاج إلى عدد من عمليات الضرب ، والتي يمكن أن تؤدي إلى الانتقال إلى حجم الكلمة التالي وستكون مهمة أقل قليلاً.

أخيرًا ، ننظر إلى الجذور المربعة في قسم منفصل ، مع العلم أننا في معظم الأحيان لا نحتاج إليها (باستثناء المجال من هذا الاختبار الأول).

كان هذا كافيًا لتشغيل العرض الأول وتتبع مشهد الاختبار (المستوى + الكرة + المثلث + المربع المستطيل) لمعرفة ما جاء منه. لقد استخدمت بسخاء الأرقام المنطقية 65 بت لهذا الاختبار الأول ، والذي يمثل في الواقع كمية كبيرة من البيانات (يمكن مقارنتها بنوع البيانات "المزدوج"): يتم أخذ 32 بت بواسطة البسط ، و 32 بت هي المقام ، و البتة الأخرى هي العلامة. الأول هو الصورة التي تم الحصول عليها باستخدام هذا النهج الساذج ، والثاني هو الصورة المصنوعة باستخدام أرقام الفاصلة العائمة (المرجع):


"السذاجة" الأرقام عقلانية 65 بت


مرجع النقطة العائمة

كانت النتيجة سيئة للغاية ، ولم يظهر المربع والمثلث حتى في المقدمة ، وكانت كرة الأرض وطائرتها مزعجة للغاية. المشكلة ، بالطبع ، هي أنه في كل مرة تقوم فيها أرقامي المنطقية بأي عملية حسابية أساسية في أي من المراحل الخوارزمية للتقديم ، أصبح البسط والمقام لا يمكن السيطرة عليهما ، لأنه تم استخدام الضرب الصحيح. فكر فيما يلي: إذا كانت وحدات عالمنا الأولي مترًا ، وقمنا بربط هندسة المصدر (الرؤوس والكاميرا) بدقة ملليمتر ، عندئذٍ فقط ستشغل بيانات المصدر وحدة تخزين 16 بت لمشهد صغير إلى حد ما. في الوقت نفسه ، مع دقة شاشة HD القياسية وتنعيم 4X ، ستتطلب أرقام اتجاه الحزمة المنطقية بسهولة 12 بت. أي أنه خلال التفاعل الأول بين الحزمة والهندسة ، فإن أبسط عملية حسابية ، باستخدام مجموعتي بيانات المدخلات ، ستحول النتيجة إلى أطوال 28 بت - قريبة بما يكفي من الحد 32 بت الذي حددته لنفسي في هذا التطبيق الأول. وهذا حتى قبل أن نقوم بأول منتج متجه أو عددي. بحلول وقت اكتمال المنتج القياسي ، سيحتاج العارض إلى أرقام منطقية لمئات البتات الطويلة لتمثيل الأرقام. بالطبع ، هذه هي الحالة الأسوأ ، لكن الحالة المتوسطة ستكون قريبة من ذلك. بالنظر إلى أنني خصصت سعة 32 بت فقط للبسط والمقام ، فمن السهل أن نفهم مدى سرعة تجاوز القيم للحدود في هذا الاختبار - وليس من المستغرب أن لا شيء تقريبًا مرئيًا باستثناء المستوى الأرضي وجزء من الكرة.

اختبار 2 - الحد من أكبر عامل مشترك




ثم قمت بتحسين النظام باستخدام الخاصية التي ذكرتها باختصار أعلاه - يمكن أن تعني الأرقام المنطقية المختلفة نفس المقدار. وفي الواقع ، فإن 6/12 هي نفس قيمة 1/2 ، لكنها تستخدم عددًا أكبر بكثير من البتات. لذلك ، كانت الفكرة على النحو التالي: إذا قمت بعد كل عملية حسابية أساسية (أو بعدها) باستخراج جميع المقسومات المشتركة من البسط والقواسم ، وجعل الكسر في أبسط أشكاله ، فربما سأكون قادرًا على إبقاء كل شيء تحت السيطرة ومواصلة العمليات لفترة أطول مع الحساب الدقيق دون فقدان الدقة. ربما يمكنك القيام بذلك لفترة كافية لتنظيف الصور المقدمة؟ سآخذ استطرادا صغيرا لإظهار مثال آخر: يمكن تبسيط 588/910 إلى 42/65 ، لأن 14 مقسوم على كل من 588 و 910. لكن لتخزين 42/65 ، من الواضح أن هناك حاجة إلى عدد أقل من البتات من 588/910. يمكن العثور على أكبر عدد ممكن يقسم في نفس الوقت الرقمين الآخرين باستخدام خوارزمية Great Common Divisor (GCD) ، والتطبيقات الفعالة التي يمكنك أن تجدها في أي مكان (أنا شخصياً نسختها مباشرةً من ويكيبيديا وسرّعت قليلاً من خلال تنفيذ خطوة المسح بت باستخدام عمليات x64 الداخلية). لذلك ، مسلحًا بخوارزمية GCD ، يجب أن يقوم صفي العقلاني بتبسيط الكسور المتولدة باستمرار أثناء عملية التقديم. يمكن القيام بذلك بطريقتين:

الأول هو تحويل النتيجة الوسيطة لمشغلي الإضافة والضرب إلى النوع التالي من بيانات البت (في الحل الساذج الحالي هو uin64_t) ، والبحث عن GCD في هذا النوع من البيانات الأكثر كثافة ، ثم تقليل النتيجة إلى طول البت الأصلي (32). الطريقة الثانية هي تحليل كيفية الجمع بين n و d و b n و b d مع بعضهما البعض في كل من العوامل الحسابية واستخراج المقسومات المشتركة بينهما قبل إجراء الضرب. النهج الثاني يلغي أساسا الحاجة إلى أطوال بت كبيرة. مع العلم أنه قد يكون من الضروري استخدامها على أي حال ، فقد قررت اختيار الطريقة الأولى ، لأنها كانت أسهل في التنفيذ وسمحت لي بالإسراع بعملي (المساء يسير بسرعة كبيرة). بعد القيام بكل هذا ، لنرى ما الذي يمكنني إنشاؤه الآن:


الأرقام المنطقية 65 بت خفضت من قبل GCD


مرجع النقطة العائمة

أفضل بكثير! حتى الآن ، بعيدًا عن المثالية ، بالطبع ، لكنها تبدو واعدة. لقد صنعت المربع والمثلث يظهران ، ويبدو أن الكرة الآن أكثر ضخامة. ومع ذلك ، ظهرت قطعة أثرية مضحكة في الزاوية العلوية اليمنى ، ولا تزال الأرقام المنطقية للعديد من البكسل تتجاوز الحدود ، مما يؤدي إلى العديد من النقاط في الصورة. ومع ذلك ، تجدر الإشارة إلى أنه بالنسبة لبعض وحدات البكسل ، بدأت في الحصول على نتائج دقيقة ومثالية! وهذا هو ، عثرت التتبع على تقاطعات دقيقة رياضية من النقاط والمسافات ، والتي كانت السبب الجذري لمحاولة استخدام الأرقام المنطقية.

قبل الانتقال إلى الخطوة التالية في عملية إثبات قابلية تطبيق الأرقام المنطقية ، أريد أن أتوقف باختصار عن النتائج التي توصلت إليها بشأن GCD وخفض الأرقام المنطقية ومشاركتها.

يرتبط الاكتشاف الأول بحجم البت للأرقام المنطقية. على الرغم من أنني ما زلت لا أستطيع تقديم صور جميلة وهذا أكثر أهمية من القلق بشأن تحسين وحدات تخزين البيانات ، وعلى الرغم من أن هذا التطبيق المبكر لا يزال يستخدم عددًا كبيرًا من وحدات البت (1 + 32 + 32) ، إلا أنني كنت أفكر بالفعل في الهدر المذكور سابقًا بت في شكل الكسور الزائدة. على وجه الخصوص ، بعد إضافة مرحلة باستخدام GCD ، لم تعد مجموعات بتات مثل 2/4 قابلة للتطبيق ، حيث يتم تقليلها تلقائيًا إلى 1/2 قبل الكتابة إلى أي سجل أو متغير. هذا ، إلى حد ما ، من بين مجموع 2 64 مجموعة من البتات التي يمكن أن تكون البسط والمقام ، ظلت العديد من غير المستخدمة. ولا يمكنك أن تضيع أجزاء من هذا القبيل. أم أنه ممكن؟ ما المساحة التي أفقدها بالفعل؟ لقد صنعت استطرادا صغيرا لاستكشاف هذه المشكلة.

استطراد - على أعداد رئيس متبادلة




توضح الرسوم التوضيحية أدناه استخدام البتات للأرقام المنطقية في 5/5 بت و 7/7 بت. يمثل المحور الأفقي والرأسي للرسوم البيانية قيم البسط والمقام لجميع الأرقام المنطقية المحتملة التي تحتوي على أرقام ومقاسات تصل إلى 5 بت (31) و 7 بت (127). البيكسلات السوداء عبارة عن مجموعات غير مستخدمة ، والبيكسلات البيضاء هي الكسور المستخدمة. على سبيل المثال ، يكون القطر بأكمله باللون الأسود ، باستثناء بكسل 1/1 ، نظرًا لأن كل كسور النموذج n / n يتم تقليلها إلى 1/1.



باستخدام البتات ل 5/5 الرشيد



باستخدام البتات ل 7/7 الرشيد

إذا قمت بحساب البيكسل ، كما فعلت ، فيمكنك أن تفهم بسرعة أن نسبة البيكسلات المفيدة مع زيادة عدد البتات تميل إلى 60.8٪. أظهر لي القليل من الأبحاث عبر الإنترنت أن هذه النسبة تبدو بالضبط 6 / π 2 ، لأنها أيضًا احتمال أن تكون أولية نسبيًا (عدم وجود مقسومات مشتركة) لعددين عشوائيين. قد تسأل ، من أين أتى بي؟ , « „“ » — , , - , 2, 1/ζ(2). , - .

, , 40% . , , … . , , , , , . - - -, , , . , .

, : , . , — (, , ), «» , , . , . , , , . . .

, — - , , . , 16/16- , , 16/16 ++ .

3 —




, . , . , , , , , ( , — , . , , , ).

, , , - . , , . , , , , . .

, , , ( ). , :


65-




, . 32/32 (65 ) 16/16 (33 ), ! , , . , . .

4 —




في هذه المرحلة ، قررت صرف انتباهي والتوقف عن البحث عن أعذار - إذا أردت أن أجد شيئًا مثيرًا للاهتمام للتقديم بأرقام عقلانية ، فيجب أن يشغلوا 32 بتًا وليس أكثر. من الأفضل أن تجد فكرة جيدة أو تتوقف ، وتنتهي هناك (كان هذا في بداية الأمسية الثانية للتجارب).

في البداية ، اعتقدت أن الأمر يستحق التمسك بأفكار GCD والتطبيع ، لكن كان من الحكمة الاقتراب من تخزين البتات واستخدامها. أول ما حدث لي هو أنه على الرغم من أن البسط والمقام يمكن أن يتراكمًا ، إلا أن هذا لا يحدث غالبًا. أو ، على الأقل ، هذا لا يحدث في وقت واحد. لذلك ، عندما يكون البسط صغيرًا ، يمكنك ترك القاسم كبيرًا ، والعكس صحيح. يمكن استخدام البتات غير المستخدمة لإحدى القيم الصحيحة لتمثيل قيم أكبر. ثم أدركت أن رقم الفاصلة العائمة هو في الأساس تنسيق النقطة الثابتة ، حيث تكون النقطة "الثابتة" متغيرة. يمكنني أخذ الأرقام المنطقية الخاصة بي ، وكذلك عمل تخطيط بت لمتغير الكسر. بمعنى أنه ليس من الصعب تعيين الكسر كـ 16/16 ، ولكن السماح لنفس المتغير 32 بت أن يكون 16/16 أحيانًا ،وأحيانا 5/27 أو 13/19 ، حسب الحاجة.

كان يستحق التدقيق بها. على أي حال ، يمكن كتابة عدد قليل من أسطر التعبئة / فك الشفرة في المستوطنين الداخليين والحروف بسرعة. المخطط الأكثر منطقية بالنسبة لي بدا 1 | 5 | 26 ، وهذا هو:

1 بت: علامة
5 بت: موضع خط الكسر (B)
26 بت: بيانات البسط والمقام المدمجة ؛ البسط هو الجزء العلوي البالغ 26 بت ، والقاسم هو البتة السفلية ،

حيث يحدد شريط الكسر (B) حجم المقام. على سبيل المثال ، سيتم كتابة الرقم 7/3 كـ

7/3 = 0 00010 000000000000000000000111 11 ،

0 , 2 ( 3), 2 , .

, IEEE754, : «1», . . «3» «1» «1»:

7/3 = 0 00001 0000000000000000000000111 1

, : , , 1 . , , 2 26 , . ! , «rational», , — , («int» «float») ! , «int» «rational». , .

, :


32- (1|5|26)


32-

--, ! - , , - . . , , , , . ( ), , .

( — ). ( ) , GPU : https://www.shadertoy.com/view/Xd2fzR .

C++, . :


32-


32 بت النقطة العائمة القياسية

نجاح باهر ، وهذا أمر جيد حقا! على الرغم من أن تسريبات الضوء واضحة للعيان في الزوايا حيث ترتبط حواف الأرض والسقف. انظر إليهم في التقريب:



ربما يكون سببهم مشكلة في تنفيذ تقاطع الشعاع ومربع مستطيل ، والذي يتم التعبير عنه فقط بأعداد عقلانية ؛ لن أفاجأ. أو ربما واجهت حدود ما يمكن للأرقام المنطقية أن تفعله. مهما كان الأمر ، فأنا سعيد للغاية. بالإضافة إلى ذلك ، لدي تغييرات وتجارب أخرى أردت اختبارها للوقت القصير المتبقي:

بعض التجارب الأخرى




حساب دقيق في 64 بت


64- , 32- (1|5|26) . 64- ?

1|6|57 ( x64 ). 57 / . ( , ). ! , , , . , , «» . . , , 64 , . : - , , , ? , «» ? , .


() . . ( ) ( ), . — , , . . .

: , x y , ,


() («» , ):


بعد البحث في ويكيبيديا ، وجدت أن هذه المعادلة المعينة هي ما يسمى "معادلة بيل المعدلة". هناك خوارزميات تجد أصغر قيم x و y لحل هذه المعادلة. لسوء الحظ ، تحول انتباهي بسرعة إلى الرياضيات ديوفانتاين غريبة أخرى ، وأنا لم المضي قدما في تنفيذ أي من هذه الخوارزميات.

تخفيض أكثر فعالية


في الدقائق الأخيرة من المساء ، فكرت في استكشاف فكرة استخدام أعضاء متعددين يجمعون في عوامل هندسية معقدة ، على سبيل المثال ، في منتج متجه. دعنا نقول أن المكون الأول لمنتج متجه هو


تحت افتراض أن sy = a / b ، tz = c / d ، ty = e / f ، sz = g / h

هذا يعني أنه يمكنني الآن محاولة العثور على مقسومات مشتركة ، على سبيل المثال ، بين a و d ، أو e و h ، واستخدامها للتقليل الأولي.

كان لدي فكرة أخرى: إذا أصبحت سرعة العرض في مرحلة ما مشكلة ، فيمكنك تعطيل خطوات البحث عن GCD تمامًا وتطبيق التطبيع فقط. أظهر الفحص السريع أنه في هذه الحالة ، تظل الصورة تظل مقبولة وتعمل بشكل جيد بسرعة أعلى بكثير. ومع ذلك ، في هذه الحالة ، بالطبع ، نحصل على نتائج دقيقة أقل حسابيًا.

كحل وسط ، يمكنك رفض تنفيذ الإجراء أو مخطط GCD ، وبدلاً من ذلك ، يمكنك استخدام شيء بسيط رياضيًا ، مشفر في الشفرة وفعال ، وتحديد قابلية القسمة على 2 و 3 و 5 فقط. على الرغم من أننا لن نجد عددًا شاملاً من المقسومات في الممارسة العملية ، سيؤدي ذلك إلى إيجاد عدد كبير من الاختصارات. فكر في الأمر - القسمة على 2 تحدث ثلاث مرات أكثر من القسمة على 7 ، و 20 مرة أكثر من القسمة على 41!

استنتاج




بعد هذه التجربة ، بدأت أؤمن أنه من الممكن تمامًا أن يستند تمثيل الأرقام إلى أرقام منطقية ، على غرار ما أسميه "كسر السطر العائم". تمثيل متوافق مع الأعداد الصحيحة وقادر على أداء العديد من العمليات في حساب دقيق للعديد من المهام (شريطة أن يتم تقديم بيانات الإدخال في شكل عقلاني). يحتوي الإصدار 64 بت (1 | 6 | 57) على إمكانات كبيرة ، على الرغم من أن الإصدار 32 بت (1 | 5 | 26) يخلق بالفعل نتائج مثيرة للاهتمام.

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

* الحصول على رسم بياني لعدد بكسل بدقة وليس تتبع بالضبط (وبعبارة أخرى ، وتيرة تنفيذ التطبيع)
* حاول تطبيق تخفيض ترميز ثابت على الفواصل 2 و 3 و 5 وقياس النسبة المئوية للبكسلات المفقودة بالضبط
* أظهر فرق البكسل بين عرض النقطة العائمة وكسر النقطة العائمة
* ابحث عن طرق مبدعة لاستخدام القيم غير المستخدمة لتنسيق البت "كسور الخطوط العائمة" ، على سبيل المثال ، للدلالة على Inf و NaN
* تنفيذ الكشف عن NaN ، Inf ، تجاوز ، تجاوز.

الكل في الكل ، كانت دراسة رائعة. في هذه العملية ، اكتشفت بعض المفاجآت ، وتوصلت إلى اختراع صغير واحد وتعلمت الكثير عن معادلة Pell ، والجذور التربيعية ، و GCD ، والآليات الداخلية x86_64 ، ووظيفة Riemann zeta وبعض الجوانب الأخرى. أنا سعيد جدا بهذا!

Source: https://habr.com/ru/post/ar448558/


All Articles