التناقض الحسابي للنقطة العائمة بين x86 وx64
في Visual Studio 2010، هناك اختلاف ملحوظ في حساب الفاصلة العائمة بين بنيات x86 وx64 ينشأ عند مقارنة قيم تعبيرات معينة. يتجلى هذا التباين في الكود التالي:
float a = 50.0f; float b = 65.0f; float c = 1.3f; float d = a * c; bool bLarger1 = dتتعامل معماريتا x86 وx64 مع التعبير الثاني، bLarger2، بشكل مختلف. في الإصدار x86، يتم تقييم bLarger2 إلى true، بينما في الإصدار x64، يتم تقييمه إلى false. يعود سبب هذا التباين إلى حساب التعبير (a * c) في عمليات الفاصلة العائمة.
أصول التباين
يكمن جذر التناقض في الاختلاف وحدات الفاصلة العائمة التي تستخدمها المعمارتان: x87 لـ x86 وSSE لـ x64. والفرق الأساسي بين الوحدتين هو دقتهما. تستخدم وحدة x87 دقة أعلى من الدقة الفردية (عادةً الدقة المزدوجة) بشكل افتراضي، بينما تعمل وحدة SSE حصريًا بدقة واحدة.
معالجة التناقض
لحل المشكلة التناقض، يمكن تكوين دقة وحدة x87 يدويًا لتتناسب مع دقة وحدة SSE. يمكن تحقيق ذلك في كود 32 بت عن طريق تنفيذ ما يلي:_controlfp(_PC_24, _MCW_PC);_controlfp(_PC_24, _MCW_PC);من خلال ضبط الدقة على دقة مفردة، يتم تقييم (a * c) في سيتم محاذاة تعبير bLarger2 مع تعبير الإصدار x64، مما يؤدي إلى تعيين كل من bLarger1 وbLarger2 على false.الاستنتاج
ينبع الاختلاف في حساب الفاصلة العائمة بين تصميمات x86 وx64 من مستويات الدقة المميزة لوحدات الفاصلة العائمة x87 وSSE. من خلال التحكم يدويًا في دقة وحدة x87 لتتوافق مع دقة وحدة SSE، يمكن إزالة التناقض، مما يضمن تقييمًا متسقًا للتعبيرات عبر كلا البنيتين.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3