मुझे जावा में "सख्त" कीवर्ड का उपयोग कब करना चाहिए?


258

मैंने देखा है कि यह क्या करता है, लेकिन क्या वास्तव में किसी का उदाहरण है कि आप strictfpजावा में कीवर्ड का उपयोग कब करेंगे ? क्या किसी ने वास्तव में इसके लिए उपयोग पाया है?

क्या मेरे सभी फ़्लोटिंग पॉइंट ऑपरेशंस पर इसे लागू करने के कोई दुष्प्रभाव होंगे?


1
हमेशा, जब तक आपको वास्तव में प्रदर्शन की आवश्यकता न हो, जब तक कि आपको प्रतिलिपि प्रस्तुत करने की आवश्यकता से अधिक न हो।
एंटीमनी

1
@Antimony - या परिशुद्धता / शुद्धता। x86 / x64, उदाहरण के लिए, आंतरिक रूप से 80-बिट फ़्लोटिंग पॉइंट रजिस्टरों का उपयोग करें, इसलिए रिफ़ंड के बिना लंबी गणना के लिए परिणाम अधिक सटीक होगा।
रॉबर्ट फ्रेजर

1
@ रॉबर्ट वास्तव में, कल्पना मंटिसा की सीमित शुद्धता की गारंटी देता है। एकमात्र अंतर यह है कि यह सामान्य की तुलना में बड़े घातांक परिशुद्धता का उपयोग कर सकता है, जिसमें दोहरे गोलाई के कारण दुर्लभ मामलों में अंतर है।
एंटिमोनी

मैं सोच रहा हूं कि इस उपयोगी संशोधक को संयुक्त के चारों ओर छिड़कने के विकल्प के अलावा, नए sfloat और sdouble आदिम स्ट्रिक्टफैट डेटाटिप्स एक अच्छा विचार हो सकता है।
theRiley

जवाबों:


274

स्ट्रिक्टफ्प यह सुनिश्चित करता है कि आपको प्रत्येक प्लेटफ़ॉर्म पर आपके फ़्लोटिंग पॉइंट गणनाओं से ठीक वैसा ही परिणाम मिले। यदि आप कड़ाई से उपयोग नहीं करते हैं, तो JVM कार्यान्वयन अतिरिक्त परिशुद्धता का उपयोग करने के लिए स्वतंत्र है जहां उपलब्ध है।

JLS से :

एफपी-सख्त अभिव्यक्ति के भीतर, सभी मध्यवर्ती मूल्यों को फ्लोट वैल्यू सेट या डबल वैल्यू सेट के तत्व होने चाहिए, जिसका अर्थ है कि सभी एफपी-सख्त अभिव्यक्तियों के परिणाम उन लोगों के लिए होने चाहिए, जिन्हें आईईईई 754 अंकगणितीय संचालकों पर एकल और दोहरे प्रारूपों का उपयोग करके दर्शाया गया है। । एक अभिव्यक्ति के भीतर जो कि एफपी-सख्त नहीं है, मध्यवर्ती परिणाम का प्रतिनिधित्व करने के लिए एक विस्तारित घातांक सीमा का उपयोग करने के लिए कुछ लेवे को लागू किया जाता है; शुद्ध प्रभाव, मोटे तौर पर, यह है कि एक गणना उन स्थितियों में "सही उत्तर" का उत्पादन कर सकती है जहां फ्लोट वैल्यू सेट या डबल वैल्यू सेट का विशेष उपयोग ओवरफ्लो या अंडरफ्लो में हो सकता है।

दूसरे शब्दों में, यह सुनिश्चित करने के बारे में है कि राइट-वन्स-रन-एनीवेयर का अर्थ वास्तव में राइट-वन्स-गेट-इक्वल-गलत-परिणाम-एवरीवेयर है

सख्त होने के साथ आपके परिणाम पोर्टेबल होते हैं, इसके बिना उनके सटीक होने की संभावना अधिक होती है।


28
इसका उपयोग प्रजनन योग्य वैज्ञानिक परिणामों और बिट-सटीक इकाई परीक्षणों के लिए करें।
Aleksandr Dubinsky

1
"यदि आप कड़ाई से उपयोग नहीं करते हैं, तो JVM कार्यान्वयन अतिरिक्त परिशुद्धता का उपयोग करने के लिए स्वतंत्र है जहां उपलब्ध है" - आप एक बुरी चीज की तरह आवाज करते हैं: P
AMDG

@LinkTheProgrammer यह निश्चित रूप से एक बुरी बात हो सकती है
टिम

@TimCastelijns मुझे लगता है हैप्पी व्हील्स आपका संदर्भ है? रिप्ले रिकॉर्ड कीस्ट्रोक्स; एफपी-गणित कार्यान्वयन सटीक विविधता के कारण, रिप्ले केवल समान हार्डवेयर पर सटीक हैं। क्या आप फ़्लोटिंग पॉइंट गणित परिवर्तनशीलता के कारण अधिक यथार्थवादी समस्या का नाम दे सकते हैं? मैं शायद एक कण सिम्युलेटर की कल्पना कर सकता हूं, लेकिन और क्या?
AMDG

तो इसका मतलब है कि हमें उत्पादन में हमेशा सख्त का उपयोग करना चाहिए जिसमें कई प्लेटफॉर्म शामिल हैं?
बीट्रीस

65

विकिपीडिया वास्तव में इस विषय के बारे में एक अच्छा लेख है यहाँ , जावा विनिर्देश के लिंक के साथ।

लाइनों के बीच पढ़ने का तात्पर्य यह है कि यदि आप निर्दिष्ट नहीं करते हैं strictfp, तो जेवीएम और जेआईटी कंपाइलर के पास आपके फ्लोटिंग-पॉइंट गणनाओं को गणना करने के लिए लाइसेंस है, जो वे चाहते हैं। गति के हित में, वे सबसे अधिक संभावना आपके प्रोसेसर के लिए अभिकलन को सौंपेंगे। इसके साथ strictfp, अभिकलन को IEEE 754 अंकगणितीय मानकों के अनुरूप होना पड़ता है, जो व्यवहार में, संभवतः इसका अर्थ है कि JVM अभिकलन करेगा।

तो आप क्यों इस्तेमाल करना चाहेंगे strictfp? एक परिदृश्य जो मैं देख सकता हूं वह एक वितरित एप्लिकेशन (या मल्टीप्लेयर गेम) में है जहां सभी फ्लोटिंग-पॉइंट गणनाओं को नियतात्मक होने की आवश्यकता नहीं है, चाहे अंतर्निहित हार्डवेयर या सीपीयू हो। व्यापार बंद क्या है? सबसे अधिक संभावना निष्पादन समय।


5
"मध्यवर्ती परिणामों का प्रतिनिधित्व करने के लिए एक विस्तारित घातांक सीमा", "फ़्लोटिंग-पॉइंट गणनाओं को गणना करने के लिए लाइसेंस नहीं है जो वे चाहते हैं", और व्यवहार में, यहां तक ​​कि strictfpअभिकलन भी एक अनैतिक 8087 FPU का उपयोग करते हैं। यह केवल मामला है कि तब थोड़ी देखभाल की आवश्यकता होती है। देखें stackoverflow.com/questions/18496560/…
पास्कल कूक

मैं @PascalCuoq re के साथ सहमत हूं: "आपके फ़्लोटिंग-पॉइंट गणना की गणना करने के लिए लाइसेंस हालांकि वे चाहते हैं" । यदि कुछ भी हो, तो इस मामले में विपरीत सत्य प्रतीत होता है, क्योंकि strictfpIEEE 754 मानक के अनुपालन का आश्वासन देता है (ताकि आपको सभी प्लेटफार्मों पर समान परिणाम मिले)। एकमात्र दोष यह है कि आप देख सकते हैं कि आपके मूल हार्डवेयर में उपलब्ध वास्तव में अच्छा FPU होने के लाभ खो सकते हैं।
टाइपरजर

25

यह सब एक कहानी के साथ शुरू हुआ,

जब जावा को जेम्स गोसलिंग, हर्बर्ट और उनकी बाकी टीम द्वारा विकसित किया जा रहा था। उनके मन में प्लेटफॉर्म इंडिपेंडेंस नामक यह पागलपन था । वे ओक (जावा) बनाना चाहते थेइतना बेहतर है कि यह किसी भी मशीन पर ठीक वैसा ही चलेगा जैसे अलग-अलग इंस्ट्रक्शन सिस्टम चला रहे हों। लेकिन, दशमलव बिंदु संख्याओं के साथ एक समस्या थी जिसे फ़्लोटिंग पॉइंट के रूप में भी जाना जाता है और प्रोग्रामिंग भाषाओं में डबल है। कुछ मशीनों को लक्ष्यीकरण दक्षता के साथ बनाया गया जबकि बाकी सटीकता को लक्षित कर रहे थे। तो, बाद में (अधिक सटीक) मशीनों में फ्लोटिंग पॉइंट का आकार 80 बिट्स था जबकि पूर्व (अधिक कुशल / तेज) मशीनों में 64 बिट डबल्स थे। लेकिन, यह एक स्वतंत्र भाषा के निर्माण के मूल विचार के खिलाफ था। साथ ही, इससे किसी मशीन (64 बिट आकार के डबल होने) पर कोड बनाया जाता है और किसी अन्य प्रकार की मशीन पर चलने पर (80 बिट आकार का दोगुना) होने पर सटीक / डेटा की हानि हो सकती है।

अप-साइज़िंग को सहन किया जा सकता है लेकिन डाउन-साइज़िंग नहीं किया जा सकता है। इसलिए, वे सख्त अवधारणा यानी सख्त तैरने वाले बिंदु की अवधारणा में आए । यदि आप इस कीवर्ड का उपयोग किसी क्लास / फंक्शन के साथ करते हैं तो इसके फ्लोटिंग पॉइंट और डबल्स का किसी भी मशीन पर लगातार आकार होता है। क्रमशः 32/64 -बिट।


8
सख्ती 1.2f जावा में शुरू की गई थी। यह बहुत बाद में था जब ओक डिजाइन किया गया था।
थोरबजर्न रेवन एंडरसन

"दशमलव बिंदु संख्या को फ्लोटिंग पॉइंट के रूप में भी जाना जाता है" - दशमलव का मतलब आधार 10 है, और फ़्लोटिंग पॉइंट प्रतिनिधित्व के साथ कुछ भी नहीं करना है।
एरियोब डे

21

यहाँ कई संदर्भ हैं:

  • स्ट्रिक्टफ (JDC टेक टिप) का उपयोग करना
  • jGuru: क्या सख्त संशोधन के लिए है? मैं इसका उपयोग करने पर कब विचार करूंगा?

    मूल रूप से, यह सब उबलता है कि क्या आप परवाह करते हैं या नहीं कि आपके कोड में फ्लोटिंग-पॉइंट एक्सप्रेशन के परिणाम तेज़ या अनुमानित हैं। उदाहरण के लिए, यदि आपको उन उत्तरों की आवश्यकता है, जो आपके कोड के साथ आते हैं, जो फ़्लोटिंग-पॉइंट मानों का उपयोग करके कई प्लेटफार्मों पर संगत होते हैं strictfp

  • सख्त - जावा शब्दावली

    फ्लोटिंग पॉइंट हार्डवेयर अधिक सटीकता के साथ गणना करता है, और जावा विनिर्देशन की तुलना में मूल्यों की एक बड़ी रेंज के साथ। यह भ्रम होगा कि कुछ प्लेटफार्मों ने दूसरों की तुलना में अधिक सटीकता दी है। जब आप strictfpकिसी विधि या वर्ग पर संशोधक का उपयोग करते हैं , तो संकलक कोड उत्पन्न करता है जो सभी प्लेटफार्मों के समान परिणामों के लिए जावा कल्पना का सख्ती से पालन करता है। बिना strictfp, यह थोड़ा ढीला है, लेकिन इतना ढीला नहीं जितना कि पेंटियम में गार्ड बिट्स का उपयोग करके 80 बिट्स की सटीकता के लिए किया जाता है।

  • और अंत में वास्तविक जावा लैंग्वेज स्पेसिफिकेशन, the15.4 FP- सख्त एक्सप्रेशंस :

    एफपी-सख्त अभिव्यक्ति के भीतर, सभी मध्यवर्ती मूल्यों को फ्लोट वैल्यू सेट या डबल वैल्यू सेट के तत्व होने चाहिए, जिसका अर्थ है कि सभी एफपी-सख्त अभिव्यक्तियों के परिणाम उन लोगों के लिए होने चाहिए, जिन्हें आईईईई 754 अंकगणितीय संचालकों पर एकल और दोहरे प्रारूपों का उपयोग करके दर्शाया गया है। । एक अभिव्यक्ति के भीतर जो कि एफपी-सख्त नहीं है, मध्यवर्ती परिणाम का प्रतिनिधित्व करने के लिए एक विस्तारित घातांक सीमा का उपयोग करने के लिए कुछ लेवे को लागू किया जाता है; शुद्ध प्रभाव, मोटे तौर पर, यह है कि एक गणना उन स्थितियों में "सही उत्तर" का उत्पादन कर सकती है, जहां फ्लोट वैल्यू सेट या डबल वैल्यू सेट का विशेष उपयोग ओवरफ्लो या अंडरफ्लो में हो सकता है।

मैं व्यक्तिगत रूप से इसके लिए उपयोग नहीं किया है, यद्यपि।


12

जैसा कि अन्य उत्तरों में उल्लेख किया गया है कि यह मध्यवर्ती अस्थायी परिणाम का परिणाम IEEE विनिर्देश के अनुरूप है। विशेष रूप से x86 प्रोसेसर IEEE कल्पना से विभिन्न परिशुद्धता के साथ मध्यवर्ती परिणाम संग्रहीत कर सकते हैं। स्थिति तब और अधिक जटिल हो जाती है जब JIT किसी विशेष गणना का अनुकूलन करता है; आदेश हर बार अलग-अलग हो सकता है जिसके परिणामस्वरूप थोड़ा अलग-अलग गोलाई हो सकता है।

ओवरहेड सख्त होने की संभावना बहुत प्रोसेसर और जेआईटी पर निर्भर होने की संभावना है। SSE2 के इस विकिपीडिया लेख में समस्या के बारे में कुछ जानकारी है। इसलिए यदि जेआईटी गणना करने के लिए एसएसई के निर्देशों को उत्पन्न कर सकता है तो ऐसा लगता है कि सख्त कानून का कोई उपरि नहीं होगा।

मेरी वर्तमान परियोजना में कुछ स्थान हैं जहां मैं सख्त का उपयोग करता हूं। एक ऐसा बिंदु है जहां संभावित ब्रह्मांडीय किरणों को पिक्सेल मूल्यों से हटाने की आवश्यकता होती है। यदि कुछ बाहरी शोधकर्ता के सामने समान पिक्सेल मूल्य और कॉस्मिक किरण हैं, तो उन्हें हमारे सॉफ़्टवेयर के समान परिणामी मूल्य मिलना चाहिए।


8
  • सस्पेन्फ एक संशोधक है जो IEEE 754 के अनुसार फ्लोटिंग पॉइंट गणना को प्रतिबंधित करता है।

  • इसे "पब्लिक स्ट्रॉन्ग क्लास StrictFpModifierExample {}" या मेथड पर "पब्लिक स्ट्रॉन्गफ़ॉफ़ वोड उदाहरण" () की तरह पूरे क्लास में इस्तेमाल किया जा सकता है। यदि इसे सभी तरीकों की तुलना में क्लास में इस्तेमाल किया जाता है, तो IEEE 754 को फॉलो किया जाएगा और अगर मेथड पर इस्तेमाल किया जाता है तो स्पेशल मेथड। IEEE 754 का पालन करें।

  • इसका उपयोग क्यों किया जाता है? ::: जैसे विभिन्न प्लेटफार्मों में अलग-अलग फ्लोटिंग पॉइंट हार्डवेयर होते हैं, जो जावा स्पेसिफिकेशन की तुलना में अधिक सटीक और अधिक रेंज वाले मानों की गणना करता है, जो कि डिफरेंशियल प्लेटफॉर्मेसो पर अलग-अलग आउटपुट उत्पन्न कर सकता है, यह समान आउटपुट की परवाह किए बिना एक ही आउटपुट की पुष्टि करता है। plateforms

  • कड़ाई से विस्तारित परिशुद्धता फ़्लोटिंग पॉइंट ऑपरेशन की गति और सटीकता का लाभ उठाने के लिए भी सुनिश्चित करता है।

  • इस कीवर्ड से कोई नुकसान नहीं है जिसका उपयोग हम तब कर सकते हैं जब हम फ्लोटिंग पॉइंट गणना कर रहे हों

  • मेरा अंतिम बिंदु है - जो IEEE754 है जिसका संक्षिप्त IEEE 754 में अस्थायी बिंदु गणना और एकल (32-बिट, जावा फ़्लोट्स में प्रयुक्त) या डबल (64-बिट, जावा में उपयोग किए जाने वाले) दोनों के लिए मानक विधि को परिभाषित करता है। युगल) परिशुद्धता। यह मध्यवर्ती गणना के लिए और विस्तारित सटीक प्रारूपों के लिए मानदंडों को भी परिभाषित करता है।


2

strictfpएक कीवर्ड है और इसे कक्षाओं या विधियों (लेकिन कभी चर नहीं) के लिए एक गैर-गैर-पहुंच संशोधक के रूप में उपयोग किया जा सकता है। एक वर्ग को चिह्नित करने का strictfpअर्थ है कि कक्षा में कोई भी विधि कोड अस्थायी बिंदुओं के लिए IEEE 754 मानक नियमों के अनुरूप होगा।

उस संशोधक के बिना, विधियों में उपयोग किए जाने वाले फ़्लोटिंग पॉइंट प्लेटफ़ॉर्म-निर्भर तरीके से व्यवहार कर सकते हैं। इसके साथ आप यह अनुमान लगा सकते हैं कि जेवीएम चल रहे अंतर्निहित प्लेटफॉर्म की परवाह किए बिना आपके फ्लोटिंग पॉइंट कैसे व्यवहार करेगा। नकारात्मक पक्ष यह है कि यदि अंतर्निहित प्लेटफ़ॉर्म अधिक सटीकता का समर्थन करने में सक्षम है, तो एक strictfpविधि इसका लाभ नहीं ले पाएगी।

यदि आप एक वर्ग के रूप में घोषित नहीं करते हैं strictfp, तो आप अभी भी strictfpएक विधि के रूप में घोषित करके विधि-दर-विधि के आधार पर व्यवहार प्राप्त कर सकते हैं strictfp

~ SCJP Sun®Certified प्रोग्रामर जावा ™ 6 के लिए - कैथी सिएरा और बर्ट बेट्स ~


0

उदाहरण के नीचे मई इसे और अधिक स्पष्ट समझने में मदद करता है: जावा में जब भी हम किसी भी ऑपरेशन के लिए सटीक जानकारी की तलाश कर रहे हैं जैसे कि अगर हम डबल num1 = 10e + 102 करते हैं; डबल संख्या 2 = 8e + 10; परिणाम = संख्या 1 + संख्या 2;

        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.

0

'सख्त' कीवर्ड का उपयोग जावा में फ्लोटिंग पॉइंट कैलकुलेशन (फ्लोट या डबल) की सटीकता को बल देने के लिए किया जाता है, स्पष्ट रूप से IEEE के 754 मानक के अनुरूप। यदि आप सख्त कीवर्ड का उपयोग नहीं करते हैं, तो फ़्लोटिंग पॉइंट सटीक लक्ष्य प्लेटफ़ॉर्म के हार्डवेयर पर निर्भर करता है।

यदि एक इंटरफ़ेस या वर्ग को सख्त के साथ घोषित किया जाता है, तो उस इंटरफ़ेस या वर्ग के भीतर सभी तरीकों और नेस्टेड प्रकारों को स्पष्ट रूप से सख्त किया जाता है।

संदर्भ लिंक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.