पाइथन फ्लोट मूल्य से सबसे कम संभव मूल्य [स्पष्टीकरण जो डुप्लिकेट नहीं है] से जोड़ने/घटाने के लिए कैसे करें?

यह प्रश्न केवल पायथन प्रोग्रामर के लिए है।

मैं किसी भी फ्लोट के लिए कुछ छोटे मूल्यों को जोड़ना/घटाना चाहता हूं जो इस फ्लोट वैल्यू को एक बिट के बारे में mantissa/महत्वपूर्ण हिस्सा । कुशलतापूर्वक इस तरह की छोटी संख्या की गणना कैसे करें।

उदाहरण के लिए मेरे पास एक्स की ऐसी सरणी है:

xs = [1e300, 1e0, 1e-300]

सबसे छोटा मूल्य उत्पन्न करने के लिए इसके लिए क्या कार्य किया जाएगा? सभी दावे वैध होना चाहिए।

for x in xs:
  assert x < x + smallestChange(x)
  assert x > x - smallestChange(x)

इस बात पर विचार करें कि 1e308 + 1 == 1e308 चूंकि 1 का अर्थ है mantissa के लिए 0 का अर्थ है 'छोटा सबसे छोटा' गतिशील होना चाहिए।

शुद्ध पायथन समाधान सबसे अच्छा होगा।


Why this is not duplicate of Increment a python floating point value by the smallest possible amount - two simple tests prove it with invalid results.

(1) प्रश्न वृद्धि में अनुत्तरित नहीं है सबसे छोटी संभव राशि द्वारा एक अजगर फ्लोटिंग पॉइंट मान अंतर:

Increment a python floating point value by the smallest possible amount just not works try this code:

import math
epsilon  = math.ldexp(1.0, -53) # smallest double that 0.5+epsilon != 0.5
maxDouble = float(2**1024 - 2**971)  # From the IEEE 754 standard
minDouble  = math.ldexp(1.0, -1022) # min positive normalized double
smallEpsilon  = math.ldexp(1.0, -1074) # smallest increment for doubles < minFloat
infinity = math.ldexp(1.0, 1023) * 2

def nextafter(x,y):    
    """returns the next IEEE double after x in the direction of y if possible"""
    if y==x:
       return y         #if x==y, no increment

    # handle NaN
    if x!=x or y!=y:
        return x + y       

    if x >= infinity:
        return infinity

    if x <= -infinity:
        return -infinity

    if -minDouble < x < minDouble:
        if y > x:
            return x + smallEpsilon
        else:
            return x - smallEpsilon  

    m, e = math.frexp(x)        
    if y > x:
        m += epsilon
    else:
        m -= epsilon

    return math.ldexp(m,e)  
print nextafter(1e307, 1e308), 'nextafter(1e307, 1e308)'
print nextafter(1e308, 1e307), 'nextafter(1e308, 1e307)'

[सबसे छोटी संभव राशि से एक पायथन फ्लोटिंग पॉइंट मान बढ़ाने] के परिणाम अमान्य है:

1e+307 nextafter(1e307, 1e308) # invalid 2e307 is possible!!!
1e+308 nextafter(1e308, 1e307) # invalid 9e307 is possible!!!

(2) यह नहीं पूछा गया था कि सबसे छोटे मूल्य को कैसे जोड़ा/घटाया जाए, लेकिन पूछा गया कि विशिष्ट दिशा में मूल्य कैसे जोड़ें/घटाएं - प्रस्तावित समाधान को एक्स और वाई को जानने की आवश्यकता है। यहां केवल एक्स जानने की आवश्यकता है।

(3) एक पायथन फ़्लोटिंग में समाधान का प्रस्ताव दें सबसे छोटी संभव राशि से बिंदु मूल्य सीमा शर्तों पर काम नहीं करेगा।

1
पाइथन में फ्लोट के लिए @ क्रोलिक हां। मुझे यकीन नहीं है कि मुझे समझाएं: मैं छोटे टुकड़े को जोड़ना या घटाना चाहता हूं, इसलिए यह कभी-कभी सबसे कम होगा (इसे सामान्य रूप से अतिप्रवाह या अंडरफ्लो को संभालने की आवश्यकता होगी)। क्या यह अब आपके लिए स्पष्ट है?
जोड़ा लेखक Chameleon, स्रोत
सरल कहकर इसे कम से कम संख्या या उच्च कम संख्या के आगे प्राप्त करने की आवश्यकता है - इसलिए 1 के लिए पूर्णांक के समानता 2 और 0 है।
जोड़ा लेखक Chameleon, स्रोत
@oefe आप गलत तरीके से पढ़ते हैं मैंने समझाया कि यह ठीक उसी उत्तर का डुप्लिकेट नहीं है क्योंकि मैं साबित करता हूं कि काम नहीं कर रहा है/बग है । यदि आप विश्वास नहीं करते हैं तो आपको इसका परीक्षण करना चाहिए - आपको जो भी प्रस्ताव है, आपको वही त्रुटियां मिलेंगी।
जोड़ा लेखक Chameleon, स्रोत
@oefe I इसका परीक्षण किया यह काम नहीं कर रहा है। जैसा कि मैंने आपको दूसरी बार समझाया है, यह डुप्लिकेट नहीं है और शुद्ध पायथन कोड इस उत्तर से काम नहीं कर रहा है और काम नहीं करना चाहिए epsilon value अवैध। नुकीले या बाइनरी चाल नहीं चाहते हैं क्योंकि मेरे पर्यावरण में काम नहीं करेगा।
जोड़ा लेखक Chameleon, स्रोत
@ofer ठीक है, यह भी बदतर है ... - स्टैक ओवरफ्लो से अंत में क्या होता है - यदि प्रश्न डुप्लिकेट नहीं है तो स्पष्टीकरण के साथ नए प्रश्न पूछें कि यह डुप्लिकेट क्यों नहीं है। मैंने आपके लिंक का परीक्षण किया और यह डिज़ाइन द्वारा काम नहीं कर रहा है और ठीक करने में सक्षम नहीं है - यह विभिन्न चीज़ों का भी समाधान है :)
जोड़ा लेखक Chameleon, स्रोत
मैं जांचूंगा कि यह आज उपयोगी है या कल सुझाव के लिए धन्यवाद - अच्छा लग रहा है ... - मुझे हेक्स के साथ कुछ समाधान पता है लेकिन कुछ तेज़ी से करना चाहते हैं।
जोड़ा लेखक Chameleon, स्रोत
@CL। क्या यह डुप्लिकेट है - आपने निर्दिष्ट नहीं किया है?
जोड़ा लेखक Chameleon, स्रोत
इसलिए, आईईईई 754 नोटेशन में दिए गए फ्लोट के लिए, आप एक ही संकेत और एक्सपोनेंट के साथ एक फ्लोट चाहते हैं, लेकिन 1 के बराबर अंश (सबसे कम बिट 1, बाकी 0), है ना?
जोड़ा लेखक Maciej Gol, स्रोत
जोड़ा लेखक Maciej Gol, स्रोत
यह है उस समस्या का डुप्लिकेट। बस पीसन के स्पष्टीकरण को पढ़ें। वह स्पष्ट रूप से चेतावनी देता है कि आपके द्वारा उद्धृत पाइथन कोड पूरी तरह से क्यूए नहीं है और शायद सभी एज केस को सही तरीके से संभाल नहीं सकता है। आपको उन अन्य समाधानों में से एक होना चाहिए जिन्हें उन्होंने अनुशंसा की है, जो बाद में सिद्ध परीक्षण कार्यान्वयन पर भरोसा करते हैं
जोड़ा लेखक oefe, स्रोत
जोड़ा लेखक oefe, स्रोत