क्या कोई प्रोग्रामिंग भाषा है जहाँ 1/6 1.0 / 6.0 के समान व्यवहार करता है?


11

जब मैं कुछ दिनों पहले C ++ में प्रोग्रामिंग कर रहा था, तो मैंने यह गलती की (कि मेरे पास इसे बनाने का इतिहास है!)। मेरे कोड के एक हिस्से में, मेरे पास 1/6 था और मैं उम्मीद कर रहा था कि यह 0.16666666666 हो सकता है जो कि ऐसा नहीं है। जैसा कि आप सभी जानते हैं कि परिणाम 0 - C, C ++, Java, Python है, सभी समान व्यवहार करते हैं।

मैं इसे अपने फेसबुक पेज पर पोस्ट करता हूं और अब इस पर बहस होती है कि क्या कोई प्रोग्रामिंग लैंग्वेज है जहां 1/6जैसा व्यवहार होता है 1.0/6.0


5
हास्केल। 1/6 = 0.16666666666666666
t123

PowerShell 0.166666666666667 उत्पन्न करता है, जिसने मुझे आश्चर्यचकित कर दिया क्योंकि 1 एक पूर्णांक है। मैं दांव लगाऊंगा। कुछ अन्य .NET भाषाएँ हैं जो आपके द्वारा अपेक्षित मूल्य उत्पन्न करती हैं।
जॉनएल

सिद्धांत रूप में, उनमें से एक असीमित संख्या है .. यहाँ एक और है: Rebol , साथ ही Orca, Red, और जैसे डेरिवेटिव। >> 1 / 6->== 0.166666666666667
इज़काता

लुआ ऐसा करता है। इसमें केवल एक ही नंबर टाइप होता है, जो आमतौर पर C के डबल के समान होता है।
मचाडो

क्लोजर 1/6में वास्तव में 1/6 (आंशिक प्रकार) है, जो करने के लिए मजबूर है Double, 1.66666 है ...
काओडी

जवाबों:


17

क्या हर कोई पास्कल को भूल गया है?

1/6पैदावार 0.1666666...(जो भी सटीक समर्थित है)।

1 div 6 पैदावार 0

यह तर्क है कि सी नियम एक गलती है। लगभग सभी सी के अंकगणितीय ऑपरेटर, जहां ऑपरेंड एक ही प्रकार के होते हैं, एक ही प्रकार का परिणाम देते हैं। निरंतरता के लिए कुछ कहा जाना चाहिए।

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

अधिकांश सी कार्यक्रमों में, पूर्णांक विभाजन को रौंदना संभवत: बस वैसे ही है जैसा आप चाहते हैं।

यदि 1 / 6C में फ्लोटिंग-पॉइंट परिणाम मिलता है, तो:

  • यह भाषा में एक विसंगति होगी।
  • मानक को मनमाने ढंग से चुनाव करना होगा जिसमें परिणाम के लिए फ्लोटिंग-पॉइंट प्रकार का उपयोग किया doubleजा सकता है ( प्राकृतिक पसंद की तरह लग सकता है, लेकिन आप अतिरिक्त सटीकता पसंद कर सकते हैं long double)
  • भाषा को अभी भी पूर्णांक विभाजन के लिए एक ऑपरेशन करना होगा ; फ्लोटिंग-पॉइंट जोड़कर प्रदर्शन करना और फिर ट्रंकटिंग संभवतः बहुत अच्छा नहीं होगा।

सी दो प्रकार के विभाजन के लिए अलग-अलग ऑपरेटर प्रदान कर सकता था, लेकिन ऊपर दूसरा बिंदु अभी भी लागू होगा: परिणाम के लिए तीन में से कौन सा फ्लोटिंग-पॉइंट प्रकार का उपयोग किया जाएगा? और चूंकि यह फ्लोटिंग-पॉइंट डिवीजन प्राप्त करने के लिए काफी आसान है, अगर आपको इसकी आवश्यकता है (एक या दोनों ऑपरेंड के लिए एक फ़्लोटिंग-पॉइंट स्थिरांक का उपयोग करें, या एक या दोनों ऑपरेंड को फ़्लोटिंग-पॉइंट प्रकार पर कास्ट करें), यह स्पष्ट रूप से नहीं था ' टी कि महत्वपूर्ण माना जाता है।

सी मैनुअल के 1974 संस्करण में (के एंड आर के पहले संस्करण के प्रकाशन से 4 साल पहले), रिची ने संभावित भ्रम का भी उल्लेख नहीं किया है:

बाइनरी / ऑपरेटर विभाजन को इंगित करता है। गुणन के लिए उसी प्रकार के विचार लागू होते हैं

जो कहता है कि यदि दोनों ऑपरेंड प्रकार के हैं intया char, परिणाम टाइप का है int

हां, यह कुछ सी प्रोग्रामर्स के लिए भ्रम का स्रोत है, विशेष रूप से शुरुआती - लेकिन सी बहुत नौसिखिए-अनुकूल होने के लिए नोट नहीं किया गया है।


5
पास्कल। सी के ठीक पहले विवरण प्राप्त करना उन्हें गलत लगा। ™
मेसन व्हीलर

और फिर अल्गोल अपने उत्तराधिकारियों (सी और पास्कल दोनों की संख्या में) पर एक सुधार था।
एपीग्रामग्राम

पास्कल - विवरण ठीक से प्राप्त करना (10 का कारक दें या लें)
मार्टिन बेकेट

1
मैंने मूल रूप से लिखा था 1.666666..., जो स्पष्ट रूप से गलत है। मेरा लंगड़ा बहाना यह है कि पास्कल परीक्षण कार्यक्रम मैंने लिखा था1.6666666666666667E-0001
कीथ थॉम्पसन

16

वास्तव में इस व्यवहार को पायथन 3 में बदल दिया गया था और यह अब वैसा ही व्यवहार करता है जैसा आप उम्मीद करते हैं ( //अब इसका उपयोग पूर्णांक विभाजन के लिए किया जाता है)।


धन्यवाद। आपके मन में कोई अन्य प्रोग्रामिंग लैंग्वेज है? मूल परिवार शायद?
पूय

1
@Pouya: यह व्यवहार पास्कल परिवार के लिए मानक है। /हमेशा एक फ्लोटिंग-पॉइंट वैल्यू पैदा करता है, और divपूर्णांक विभाजन के लिए एक अलग ऑपरेटर ( ) का उपयोग किया जाता है।
मेसन व्हीलर

13

प्रमुख भाषाओं में से, जावास्क्रिप्ट। 1.0 / 6.0 = 1/6 = 0.16666666666666666।

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

बस ध्यान रखें कि अतिरिक्त चीजें हैं जो यहां भी खेल सकती हैं, जैसे कि पहले से ही अलग पूर्णांक डिवीजन ऑपरेटर या निहित प्रकार की कास्टिंग।


6
यह "अंगूठे का एक नियम" नहीं है। यह C का नियम है, और मुट्ठी भर भाषाओं में C की गलतियों को आँख बंद करके कॉपी किया गया है।
मेसन व्हीलर

4
@MasonWheeler: क्या फोरट्रान ने "सी की गलती को आँख बंद करके कॉपी किया था"? मेरा व्यक्तिगत रूप से मानना ​​है कि अच्छी तरह से डिज़ाइन की गई भाषाओं को अलग-अलग ऑपरेटरों के लिए पूर्णांक मात्रा के अनुमानित विभाजन (और, btw, मूल्य और संदर्भात्मक समानता के लिए) का उपयोग करना चाहिए, लेकिन FORTRAN के दिनों में डिज़ाइन का निर्णय संभवतः उचित था। इसका मतलब यह नहीं है कि हर भाषा को उन चीजों को करना चाहिए जिस तरह से 1950 में फोरट्रान ने किया था।
सुपरकैट

3
निचले स्तर की भाषाओं को ये अंतर बनाने की जरूरत है। उच्च स्तरीय / गतिशील भाषाएं अक्सर उनके बिना बेहतर होती हैं। यह एक डिज़ाइन ट्रेड-ऑफ है। मैं जेएस में सिर्फ एक बड़ा गूंगा नंबर कंस्ट्रक्टर / टाइप होने की सराहना करता हूं, लेकिन मुझे लगता है कि मैं महसूस कर रहा हूं कि जेएस की कमी थी जब सख्त प्रकार के नियंत्रण के बिना एक उच्च प्रदर्शन 3 डी इंजन लिखने की कोशिश कर रहा था। जेएस की अन्य भाषाओं के साथ अतिव्यापी उपयोगिता हो सकती है, लेकिन मुझे नहीं लगता कि कोई भी कभी भी इसे उच्च प्रदर्शन करीब-से-क्रोम प्रकार के सामान लिखने के लिए एक गोटो पर विचार करने जा रहा है।
एरिक रेपेने

2
प्रोग्रामिंग के बाहर गणित विभाजन के लिए पूर्णांक-केवल नियमों को मानता है।
एरिक रेपेने

5
@MasonWheeler: प्रोग्रामिंग शुद्ध गणित नहीं है। गणितीय रूप से, 1/6 एक परिमेय संख्या है और बाइनरी फ्लोटिंग पॉइंट संख्या द्वारा इसका सही प्रतिनिधित्व नहीं किया जा सकता है। एकमात्र सटीक प्रतिनिधित्व एक भाजक के साथ छह गुना अंश के अनुपात के रूप में होता है।
केविन क्लाइन

7

ऐसी कई भाषाएं हैं जिनका ((1/6)*6)परिणाम 1 में है, 0. में नहीं। उदाहरण के लिए, पीएल / एसक्यूएल, कई बुनियादी बोलियाँ, लुआ।

संयोग से, उन सभी भाषाओँ में 1/6 का परिणाम .166666667, या 0.166666666666 या कुछ समान है। मैंने उन छोटे अंतरों से छुटकारा पाने के लिए (1/6) * 6) == 1 संस्करण को चुना।


7
यह सवाल नहीं है।
रॉस मार्टि

20
संयोग से, उन सभी भाषाओँ में 1/6 का परिणाम .166666667, या 0.166666666666 या कुछ समान है। मैंने ((1/6)*6)==1उन छोटे अंतरों से छुटकारा पाने के लिए संस्करण को चुना , लेकिन ऐसा लगता है कि मैंने कुछ लोगों के गणित कौशल को कम कर दिया।
user281377

1
@ RocMartí हाँ, यह वास्तव में है ...
MattDavey

1
मुझे देखकर आश्चर्य होगा (१.० / ६.०) * ६ बिल्कुल १ के बराबर हो रहा है! (1.0 / 6.0) के परिणाम की गोलाई एक छोटे अंतर को जन्म देगी। (हालांकि कुछ भाषाएं होंगी जो अनंत परिशुद्धता के लिए डिफ़ॉल्ट हैं)
सोज़र्ड

1
@Sjoerd: वास्तव में यह वास्तव में सटीक है, यह बहुत अधिक नहीं है। दशमलव में 1/11 * 11 के परिदृश्य पर विचार करें, जिसमें पाँच महत्वपूर्ण आंकड़े सटीक हों। 1/11 का मान 9.0909 * 10 ^ -2 है। 11 से गुणा करें और राउंडिंग से पहले 99.9999 * 10 / -2 मिलेगा। पांच महत्वपूर्ण आंकड़ों के लिए राउंड और परिणाम 1.0000 * 10 ^ 0 होगा। ध्यान दें कि कुंजी यह है कि 1/6 का मंटिसा "... 0101010101 ..." है। यदि प्रतिनिधित्व का अंतिम बिट "1" है, तो इसे छह से गुणा करना और गोल करना 1. उपज देगा। यदि अंतिम बिट शून्य था, तो यह नहीं होगा।
सुपरकैट

3

हास्केल 1/6 और 1.0 / 6.0 को समान रूप से 0.16666666666666666 मानता है। यह 1 / 6.0 और 1.0 / 6 भी प्रदान करता है और साथ ही समान मूल्य भी।

यह हास्केल में मूल संख्यात्मक प्रकारों के कारण अन्य भाषाओं के समान नहीं है। सच पूर्णांक विभाजन कुछ जटिल है ... जटिल।


2

हाँ, पर्ल करता है। वन-लाइनर

perl -e '$x=1/6;print "$x\n";'

के उत्पादन में परिणाम:

0.166666666666667

मेरा मानना ​​है कि PHP उसी तरह काम करती है।

जोड़ने के लिए संपादित: मेरा यह भी मानना ​​है कि 1/6 == 1.0/6.0कमजोर भाषा में टाइप की जाने वाली भाषा के लिए एक आवश्यक (लेकिन पर्याप्त नहीं) स्थिति है।


बिल्ली कमजोर टाइपिंग क्यों होगी (जो भी इसका मतलब है) आवश्यक है? दोनों तर्कों के पूर्णांक होने के मामले में बस / / (भी) का अर्थ फ्लोट डिवीजन है।

1
@delnan - en.wikipedia.org/wiki/Weak_typing मुझे लगता है कि यह एक जोरदार टाइप की गई भाषा हो सकती है जिसमें /तर्क के प्रकारों के आधार पर स्वचालित रूप से ओवरलोड किया जाता है, लेकिन ऐसा लगता है कि सिद्धांत के सिद्धांत का उल्लंघन है मुझे ...

2
कमजोर / मजबूत टाइपिंग को परिभाषित किया गया है (जैसा कि विकि का तात्पर्य भी है), कृपया इससे बचें और विशिष्ट बनें। मैं इसे आपकी परिभाषा पर रोक लगाता हूं, लेकिन यह तदर्थ बहुरूपता नहीं है? यदि ऐसा है, तो हास्केल पर विचार करें, जिसका कोई निहित रूपांतरण नहीं है, लेकिन बहुत अच्छी तरह से निष्पादित (जैसा कि, समय का 99% काम करता है और नश्वर लोगों द्वारा समझा जा सकता है) संख्यात्मक बहुरूपता। और यह आश्चर्यजनक क्यों होगा? अगर मैं किसी भी ऑपरेटर के हर एक उदाहरण के लिए सटीक सटीक इच्छा के आधार पर कई डॉट्स जोड़ना था, तो यह मेरे लिए कहीं अधिक आश्चर्यजनक (कष्टप्रद नहीं कहना) होगा।

2
@JackManey मुझे लगता है कि अधिकांश नवागंतुकों के लिए यह अधिक आश्चर्यजनक है कि 1/2 को 0 के बराबर होना चाहिए, यदि दो पूर्णांक परिणामों को एक डबल में विभाजित किया जाए। सभी पूर्णांकों को गणित में विभाजन के तहत बंद नहीं किया जाता है। डेलान ने भी कहा कि हास्केल एक दृढ़ता से टाइप की गई भाषा का एक उदाहरण है जिसमें दो पूर्णांक पर एक पूर्णांक नहीं बनता है। और पायथन 3 एक और है।
sepp2k

1
Haxe भाषा दृढ़ता से (यद्यपि अनुमान लगाया गया है) टाइप की गई है, और फिर भी इसका पूर्णांक विभाजन नहीं है, केवल फ्लोट है। तो यह तूम गए वहाँ।
केटीफ

2

/पूर्णांक में स्क्वीच स्मॉलटाक में फिटर ऑब्जेक्ट्स बनाता है। तो जबकि यह फ्लोट डिवीजन के समान नहीं है, फिर भी (1/6)*61 रिटर्न करता है।


सभी स्मॉलटॉक -80 में व्युत्पन्न (जो लगभग सभी स्मॉलटैक्स हैं)। एम्बर समकालीन अपवादों में से एक है (जो समझ में आता है, जावास्क्रिप्ट के लिए संकलित किया जा रहा है)।
हर्ब

2

हां, मैंने अभी - अभी TI BASIC में निर्मित मेरे TI-99 / 4A की जाँच की है । चूंकि यह सभी संख्यात्मक अभिव्यक्तियों को फ्लोटिंग पॉइंट के रूप में मानता है, इसलिए डिवीजन ऑपरेशन फ्लोटिंग पॉइंट भी है।

 TI BASIC READY
>PRINT 1/6
  .1666666667

>


2

MATLAB। संख्यात्मक शाब्दिक डिफ़ॉल्ट रूप से डबल्स हैं।

>> 1/6
ans =
    0.1667

2

क्लोजर डिफ़ॉल्ट रूप से भिन्न का उपयोग करता है। यह 1.0 / 6.0 के समान नहीं है, लेकिन आप इसे ज़रूरत पड़ने पर floatया इसके साथ बदल सकते हैं double

user=> (/ 1 6)
1/6
user=> (* (/ 1 6) 2)
1/3
user=> (pos? (/ 1 6)) ; Is 1/6 > 0?
true
user=> (float (/ 1 6))
0.16666667

1

आश्चर्यजनक रूप से, यह विंडोज पावरशेल (संस्करण 3) में ठीक से काम करने लगता है ।

PS C:\> 1.0 / 6.0
0.166666666666667

PS C:\> 1/6
0.166666666666667

इसके अलावा Python 3 में sepp2k के रूप में काम करने के लिए लगता है। अन्य दो भाषाएँ जिन्हें मैंने REPL, Scala और Ruby पर आसानी से उपलब्ध किया है, दोनों पूर्णांक विभाजन और उपज 0 हैं।


0

Rexx भाषा हमेशा एक सही उत्तर का उत्पादन करती है। उदाहरण के लिए: 5/2 = 2.5। Rexx एक बेहतरीन भाषा है जिसका पर्याप्त उपयोग नहीं किया गया है। सिद्धांत रूप में, जब कोई कंपाइलर यह निर्धारित नहीं कर सकता कि आप क्या चाहते हैं, तो इसका सही गणित करना बेहतर है, हालाँकि, यह कुशल नहीं हो सकता है। Rexx भी // ऑपरेटर प्रदान करता है।

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