متى يجب علي استخدام الكلمة الأساسية "strictfp" في جافا؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

لقد بحثت عما يفعله هذا، ولكن هل لدى أي شخص بالفعل مثال على متى ستستخدم strictfp الكلمة الرئيسية في جافا؟هل وجد أي شخص بالفعل استخدامًا لهذا؟

هل سيكون هناك أي آثار جانبية لمجرد وضعه على جميع عمليات الفاصلة العائمة الخاصة بي؟

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

المحلول

وStrictfp يضمن أن تحصل عليه بالضبط نفس النتائج من هاتفك حسابات النقطة العائمة على كل منصة. إذا كنت لا تستخدم strictfp، وتنفيذ JVM مجاني للاستخدام دقة إضافية حيثما كان ذلك متاحا.

من JLS :

<اقتباس فقرة>   

وضمن تعبير FP-الصارم، كل   يجب أن تكون القيم المتوسطة العناصر   من قيمة تعويم تعيين أو ضعف   مجموعة قيمة، مما يعني أن النتائج   يجب أن تكون جميع التعبيرات FP-صارمة   تلك التي تنبأ بها IEEE 754 الحساب   على المعاملات ممثلة باستخدام احد   وصيغ مزدوجة. ضمن   التعبير ليست-FP صارمة، بعض   يتم منح مهلة ل   تنفيذ لاستخدام موسعة   مجموعة الأس لتمثيل   نتائج متوسطة؛ صافي التأثير،   تحدث تقريبا، هو أن   الحساب قد تنتج "الصحيح   الجواب "في الحالات التي يكون فيها حصرية   استخدام مجموعة قيمة تعويم أو مزدوج   مجموعة قيمة قد يؤدي إلى تجاوز أو   تجاوز الحد الأدنى.

وبعبارة أخرى، ولكن عن التأكد من أن <م> الكتابة مرة واحدة-تشغيل-في أي مكان يعني في الواقع <م> الكتابة مرة واحدة-GET-وبالمثل-خطأ-النتائج في كل مكان .

ومع strictfp نتائجك هي المحمولة، وبدون ذلك هم أكثر عرضة لتكون دقيقة.

نصائح أخرى

ويكيبيديا لديه بالفعل مقالة جيدة حول هذا الموضوع هنا ، مع وصلة لمواصفات جاوة .

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

وهكذا لماذا كنت تريد استخدام strictfp؟ سيناريو واحد أستطيع أن أرى في تطبيق توزيعها (أو لعبة متعددة) حيث تحتاج كل حسابات الفاصلة العائمة أن تكون حتمية بغض النظر عن الأجهزة الأساسية أو وحدة المعالجة المركزية. ما هو المفاضلة؟ معظم وقت التنفيذ احتمالا.

بدأ كل شيء بقصة،

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

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

وهنا عدة مراجع:

  • باستخدام الصارمfp (نصيحة تقنية JDC)
  • جغورو: ما هو المعدل الصارم لـ؟متى أفكر في استخدامه؟

    في الأساس، كل ما يتلخص في ذلك هو ما إذا كنت تهتم أم لا بأن تكون نتائج تعبيرات الفاصلة العائمة في التعليمات البرمجية الخاصة بك سريعة أو يمكن التنبؤ بها.على سبيل المثال، إذا كنت تريد أن تكون الإجابات التي تأتي بها التعليمات البرمجية الخاصة بك والتي تستخدم قيم الفاصلة العائمة متسقة عبر منصات متعددة، فاستخدم strictfp.

  • الصارم - مسرد جافا

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

  • وأخيرًا مواصفات لغة جافا الفعلية، §15.4 التعبيرات الصارمة FP:

    ضمن تعبير FP الصارم، يجب أن تكون جميع القيم المتوسطة عبارة عن عناصر من مجموعة القيمة العائمة أو مجموعة القيم المزدوجة، مما يعني أن نتائج جميع تعبيرات FP الصارمة يجب أن تكون تلك التي تنبأ بها حساب IEEE 754 على المعاملات الممثلة باستخدام تنسيقات مفردة ومزدوجة .ضمن تعبير ليس مقيدًا بـ FP، يتم منح بعض الفسحة للتنفيذ لاستخدام نطاق الأس الموسع لتمثيل النتائج المتوسطة؛التأثير الصافي، تقريبًا، هو أن الحساب قد ينتج "الإجابة الصحيحة" في المواقف التي قد يؤدي فيها الاستخدام الحصري لمجموعة القيمة العائمة أو مجموعة القيمة المزدوجة إلى تجاوز السعة أو تجاوز السعة.

على الرغم من ذلك، لم أستخدمه شخصيًا أبدًا.

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

والنفقات العامة التي تتكبدها strictfp المرجح أن يكون المعالج جدا وJIT التابع. ويبدو أن هذه المادة يكيبيديا على SSE2 لديك فكرة عن هذه المشكلة. إذا كان الأمر كذلك JIT يمكن أن تولد تعليمات SSE لتنفيذ عملية حسابية يبدو أن strictfp لن يكون لها اي سماء المنطقة.

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

  • الصارمfp هو مُعدِّل يقيد حسابات الفاصلة العائمة وفقًا لـ IEEE 754.

  • يمكن استخدام هذا في الفصل بأكمله مثل "public الصارمfp class StrictFpModifierExample{}" أو في الأسلوب "public الصارمfp void example()". إذا تم استخدامه في الفصل، فستتبع جميع الطرق IEEE 754 وإذا تم استخدامها في الطريقة، فستتبع طريقة معينة اتبع IEEE 754.

  • ولماذا يستخدم؟؟:::نظرًا لأن الأنظمة الأساسية المختلفة تحتوي على أجهزة فاصلة عائمة مختلفة والتي تحسب بدقة أكبر ونطاق أكبر من القيم مما تتطلبه مواصفات جافا والتي قد تنتج مخرجات مختلفة على أشكال لوحات مختلفة. لذلك فهي تؤكد نفس المخرجات بغض النظر عن أشكال اللوحات المختلفة

  • يضمن الصارمfp أيضًا الاستفادة من سرعة ودقة عمليات الفاصلة العائمة ذات الدقة الموسعة.

  • ليس هناك أي عيب في هذه الكلمة الأساسية التي يمكننا استخدامها عندما نقوم بحسابات الفاصلة العائمة

  • نقطتي الأخيرة هي-ما هو IEEE754 في IEEE 754 القصير يحدد الطريقة القياسية لكل من حسابات النقطة العائمة وتخزين قيم النقاط العائمة في إما واحدة (32 بت ، تستخدم في عوامات Java) أو مزدوجة (64 بت ، تستخدم في Java الزوجي) الدقة. كما تحدد المعايير للحسابات الوسيطة والتنسيقات الدقيقة الممتدة.

وstrictfp هو الكلمة، ويمكن استخدامها كمادة محورة غير غير الوصول لفئات أو أساليب (ولكن أبدا المتغيرات). بمناسبة فئة كما strictfp يعني أن أي رمز أسلوب في فئة ومطابقة للقواعد القياسية IEEE 754 للحصول على نقاط العائمة.

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

إذا كنت لا يعلن فئة كما strictfp، لا يزال بإمكانك الحصول السلوك strictfp على أساس طريقة كل طريقة، بإعلان الأسلوب كما strictfp.

~ SCJP Sun®Certified مبرمج جافا ™ 6 - كاثي سييرا وبيرت بيتس ~

ومايو أدناه سبيل المثال مساعدة في فهم هذا أكثر وضوحا: في جافا كلما كنا تستخدم تبحث عن معلومات دقيقة عن أي عملية على سبيل المثال             اذا لم نفعل NUM1 مزدوج = 10E + 102؛ NUM2 مزدوج = 8E + 10؛                 النتيجة = NUM1 + NUM2؛

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top