अजगर सुन्न मशीन एप्सिलॉन


103

मैं समझने की कोशिश कर रहा हूं कि मशीन एप्सिलॉन क्या है। विकिपीडिया के अनुसार, इसकी गणना निम्न प्रकार से की जा सकती है:

def machineEpsilon(func=float):
    machine_epsilon = func(1)
    while func(1)+func(machine_epsilon) != func(1):
        machine_epsilon_last = machine_epsilon
        machine_epsilon = func(machine_epsilon) / func(2)
    return machine_epsilon_last

हालांकि, यह केवल डबल सटीक संख्याओं के लिए उपयुक्त है। मैं इसे एकल सटीक संख्याओं का समर्थन करने के लिए संशोधित करने में रुचि रखता हूं। मैं पढ़ता हूं कि विशेष रूप से numpy.float32वर्ग के लिए खसखस का उपयोग किया जा सकता है । क्या कोई फ़ंक्शन को संशोधित करने में मदद कर सकता है?


8
यह फ़ंक्शन सामान्य है कि सभी पूर्वाग्रहों के साथ काम करना पर्याप्त है। बस numpy.float32फ़ंक्शन के तर्क के रूप में पास करें !
डेविड ज़्विकर

जवाबों:


192

दिए गए फ्लोट प्रकार के लिए मशीन एप्सिलॉन प्राप्त करने का एक आसान तरीका है np.finfo():

print(np.finfo(float).eps)
# 2.22044604925e-16

print(np.finfo(np.float32).eps)
# 1.19209e-07

3
सिर्फ 100% आश्वस्त होने के लिए, पहला व्यक्ति जन्मजात तैरने के लिए "मानक" सटीकता प्रदान करता है, जबकि दूसरा खस्ता तैरने की शुद्धता है?
चार्ली पार्कर

2
ध्यान दें कि सुन्न की मानक सटीकता 64 (64 बिट कंप्यूटर में) है: >>> print(np.finfo(np.float).eps) = 2.22044604925e-16 और >>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
चार्ली पार्कर

2
@CharlieParker मैं np.floatइसके बजाय इस्तेमाल कर सकता था , क्योंकि यह पायथन के बिलिन का सिर्फ एक उपनाम है floatdoubleलगभग सभी प्लेटफार्मों पर पायथन फ्लोट 64-बिट (सी ) हैं। floatऔर np.float64इसलिए आमतौर पर इसके बराबर सटीकता होती है, और अधिकांश उद्देश्यों के लिए आप इनका उपयोग कर सकते हैं। हालांकि वे समान नहीं हैं - np.float64एक विशिष्ट-विशिष्ट प्रकार है, और एक np.float64स्केलर के पास एक देशी floatस्केलर के लिए अलग-अलग तरीके हैं । जैसा कि आप उम्मीद करते हैं, np.float32एक 32-बिट फ्लोट है।
एलिया_ एमवी

92

एप्सिलॉन पाने का एक और आसान तरीका है:

In [1]: 7./3 - 4./3 -1
Out[1]: 2.220446049250313e-16

4
हाँ, और क्यों 8./3 - 5./3 - 1उपज -eps, और 4./3 - 1./3 - 1पैदावार शून्य, और 10./3 - 7./3 - 1पैदावार शून्य?
स्टीव टोज़ा

20
आह, जवाब यहाँ है, समस्या 3: rstudio-pubs-static.s3.amazonaws.com/ ... मूल रूप से, यदि आप 7/3 से 4/3 के द्विआधारी प्रतिनिधित्व को घटाते हैं, तो आपको मशीन एप्सॉन की परिभाषा मिलती है। इसलिए मुझे लगता है कि यह किसी भी मंच के लिए होना चाहिए।
स्टीव टोज़ा

13
यह उस उत्तर का बहुत गूढ़ है जिसे एप्सॉन को खोजने के लिए numpyएक मौजूदा numpyफ़ंक्शन होने पर पायथन और आंतरिक के बहुत अधिक ज्ञान की आवश्यकता होती है ।
ओल्गा बोट्वनिक

29
इस उत्तर को अजगर या सुन्न इंटर्न के किसी भी ज्ञान की आवश्यकता नहीं है।
GuillaumeDufay

5
वास्तव में, यह दावा करता है कि पाठक उन कंप्यूटरों पर चलने के बारे में जानते हैं जो अंतर्निहित बेस -3 गणना का उपयोग नहीं कर रहे हैं।
कोकसील

17

यह पहले से ही काम करेगा, जैसा कि डेविड ने बताया!

>>> def machineEpsilon(func=float):
...     machine_epsilon = func(1)
...     while func(1)+func(machine_epsilon) != func(1):
...         machine_epsilon_last = machine_epsilon
...         machine_epsilon = func(machine_epsilon) / func(2)
...     return machine_epsilon_last
... 
>>> machineEpsilon(float)
2.220446049250313e-16
>>> import numpy
>>> machineEpsilon(numpy.float64)
2.2204460492503131e-16
>>> machineEpsilon(numpy.float32)
1.1920929e-07

btw आपका फ़ंक्शन बढ़ाएगा NameErrorयदि स्थिति whileपहले चेक पर संतुष्ट हो जाएगी, तो यह संभवतः machine_epsilon = machine_epsilon_last = func(1)पहले बयान में करने के लिए समझ में आता है
अज़ात इब्राकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.