संख्यात्मक बैश शैल चर का अधिकतम मूल्य क्या है?


17

मैं उत्सुक हूँ कि क्या होता है जब बाश में एक संख्यात्मक चर को जानबूझकर बिना रोक-टोक के बढ़ा दिया जाता है। संख्या कितनी बड़ी हो सकती है? क्या यह अतिप्रवाह होगा और नकारात्मक हो जाएगा और बस हमेशा के लिए वेतन वृद्धि जारी रखेगा? क्या यह टूट जाएगा और किसी बिंदु पर रुक जाएगा?

मैं एक x86_64 एएमडी प्रोसेसर का उपयोग कर रहा हूं, लेकिन मैं 32 बिट के उत्तर के रूप में अच्छी तरह से सुनकर खुश होऊंगा, बस वह निर्दिष्ट करें जिसके बारे में आप बात कर रहे हैं। मैं Fedora21 64bit चला रहा हूं।

मैं दूर-दूर तक जा चुका हूँ, लेकिन किसी विषम कारण के लिए यह विशिष्ट tidbit नहीं मिला है। ऐसा लगता है कि यह सभी मैनुअल और इस तरह की जानकारी का एक मूल टुकड़ा होगा।


3
कैसे स्टार्टर के रूप में 2 की कुछ शक्तियों को प्रिंट करने के बारे में:for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
mpy

1
यदि आप बड़ी संख्या चाहते हैं, तो आप kshफ्लोटिंग पॉइंट अंकगणित पर स्विच कर सकते हैं , पूर्णांक एक की तरह नहीं bash: ksh -c 'echo $((2**1023))'8.98846567431157954e+307
jlliagre

अगर मैं स्ट्रैटोस्फियर में फ्लोटिंग पॉइंट या वैल्यूज़ की ज़रूरत हूँ तो मैं ksh को ध्यान में रखूँगा, फ़्लोटिंग पॉइंट काफी उपयोगी हो सकता है। लेकिन यह सवाल बस इतना है कि मैं अपने सिस्टम की सीमा जानता हूं, ऐसा नहीं है क्योंकि मुझे इसकी सीमाएं पार करने की जरूरत है। मैं कुछ ऐसा करूंगा जैसे mpy से पता चलता है, मैंने शुरू नहीं किया क्योंकि मैं नहीं चाहता था कि सिस्टम क्रैश के कारण जोखिम हो।
मैक्स पावर

जवाबों:


22

यह आपके संस्करण के bash, आपके OS और आपके CPU आर्किटेक्चर के लिए नीचे आ सकता है। आप इसे स्वयं क्यों नहीं आजमाते? (2 ^ 31) -1 के लिए एक चर सेट करें, फिर इसे बढ़ाएँ, इसे 2 ^ 32 पर सेट करें, फिर इसे बढ़ाएँ, इसे 2 ^ 64 पर सेट करें, फिर इसे बढ़ाएँ, आदि।

यहाँ, मैंने अभी अपने आप को अपने कोर i7 मैक पर OS X "El Capitan" v10.11.3 चलाने की कोशिश की, और ऐसा लगता है कि बैश हस्ताक्षर किए हुए 64-बिट पूर्णांक का उपयोग कर रहा है।

$ uname -a
डार्विन Spiff.local 15.3.0 डार्विन कर्नेल संस्करण 15.3.0: Thu Dec 10 18:40:58 PST 2015; रूट: xnu-3248.30.4 ~ 1 / RELEASE_X86_64 x86_64
$ बैश - फैलाव
मार - मार
GNU बैश, संस्करण 3.2.57 (1) -release (x86_64-apple-darwin15)
कॉपीराइट (C) 2007 फ्री सॉफ्टवेयर फाउंडेशन, इंक।
$
$ ((एक्स = 2 ** 16)); गूंज $ X
65536 <- ठीक है, कम से कम UInt16
$ ((एक्स = 2 ** 32)); गूंज $ X
4294967296 <- ठीक है, कम से कम UInt32
$ ((एक्स = 2 ** 64)); गूंज $ X
0 <- oops, UInt64 नहीं
$ (X = (2 ** 63) -1)); गूंज $ X
922337203685474775807 <- ठीक है, कम से कम SInt64
$ ((X ++)); गूंज $ X
-922337203685474775808 <- अतिप्रवाहित और लिपटे नकारात्मक। SInt64 होना चाहिए

3

मैंने एक लूप सेट किया। while return status is 0 increment a variable with addition and print the variable to stdout मैंने इसे केवल 2 ^ 31 के तहत शुरू किया, मैंने इसे 2 ^ 31 और 2 ^ 32 दोनों को बिना किसी मुद्दे के पास कर दिया, इसे रोक दिया, फिर प्रारंभिक मूल्य को केवल 2 ^ 63 के नीचे सेट किया। इसका परिणाम यह हुआ कि यह मूल रूप से 9.22e18 से -9.22e18 तक लुढ़क गया और सकारात्मक वृद्धि करता रहा। (शून्य की ओर)

बस यह जांचने के लिए कि मेरा while [ $? -eq 0 ]वास्तव में लूप के भीतर कमांडों के बाहर निकलने की स्थिति का उपयोग कर रहा था, पिछली स्क्रिप्ट की निकास स्थिति या कुछ विषमता का उपयोग नहीं कर रहा था, मैंने इसे एक अतिरिक्त कमांड के साथ चलाया जिसमें लूप के अंदर एक गैर शून्य निकास बनाया गया विशेष वेतन वृद्धि पर स्थिति।

तो यह हस्ताक्षरित है, यह अधिकतम मूल्य पर रोक के बजाय रोल करेगा, और यह बिना किसी त्रुटि संदेश के ऐसा करता है। तो यह वास्तव में अनंत लूप में समाप्त करना संभव है। यह 64bit हार्डवेयर और 64bit linux OS को एक पुराने 16 या 32bit मानक तक सीमित नहीं करता है।


2

बैश 64-बिट पूर्णांक का उपयोग करें। इसलिए यदि आप चर को उसकी अधिकतम संख्या तक पहुंचने के बाद बढ़ाते हैं, तो चर अतिप्रवाह हो जाएगा। नीचे अहस्ताक्षरित int और हस्ताक्षरित पूर्णांक के साथ मेरी परीक्षा है।

MAX_UINT = 18446744073709551615
MAX_INT = 9223372036854775807

$ printf "%llu\n" $((2**64))
0
$ printf "%llu\n" $((2**64-1))
18446744073709551615

$ printf "%lld\n" $((2**63-1))
9223372036854775807
$ printf "%lld\n" $((2**63))
-9223372036854775808
$ printf "%lld\n" $((2**64-1))
-1

2
कृपया कुछ पाठ जोड़ें जिसमें बताया गया है कि यह प्रश्न का उत्तर कैसे देता है। ऐसा लगता है कि आप कोड के माध्यम से ऊपरी सीमाओं को प्रदर्शित करने की कोशिश कर रहे हैं - क्या आप बता सकते हैं कि यह कोड आवश्यक परिणाम क्यों प्राप्त करेगा?
सर एडिलेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.