পাইথন নম্পি মেশিন অ্যাপসিলন


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ফাংশনটির পক্ষে যুক্তি হিসাবে কেবল একটি পাস করুন !
ডেভিড জুইকার 16

উত্তর:


192

প্রদত্ত ফ্লোট টাইপের জন্য মেশিনের এপসিলন পাওয়ার একটি সহজ উপায়টি হ'ল np.finfo():

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

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

3
মাত্র ১০০% আত্মবিশ্বাসী হওয়ার জন্য, প্রথমটি সহজাত ভাসমানগুলির অজগরকে "স্ট্যান্ডার্ড" নির্ভুলতা সরবরাহ করে যখন দ্বিতীয়টি নালীর ফ্লোটগুলির যথার্থতা দেয়?
চার্লি পার্কার

2
নোটির মান যথার্থতা 64 (একটি 64 বিট কম্পিউটারের মধ্যে) নোট করুন: >>> print(np.finfo(np.float).eps) = 2.22044604925e-16 এবং >>> print(np.finfo(np.float64).eps) = 2.22044604925e-16
চার্লি পার্কার

2
@ চর্লিপারপারার np.floatপরিবর্তে আমি এটি ব্যবহার করতে পারতাম , কারণ এটি পাইথনের বিল্টিনের কেবল একটি উপনাম float। পাইথন ভাসমানগুলি doubleপ্রায় সমস্ত প্ল্যাটফর্মে -৪-বিট (সি ) থাকে। floatএবং np.float64তাই সাধারণত সমতুল্য নির্ভুলতা থাকে এবং বেশিরভাগ উদ্দেশ্যে আপনি এগুলি বিনিময়যোগ্যভাবে ব্যবহার করতে পারেন। তবে সেগুলি অভিন্ন নয় - np.float64এটি একটি নমপি-নির্দিষ্ট ধরণের, এবং কোনও np.float64স্কেলারের দেশীয় floatস্কেলারের বিভিন্ন পদ্ধতি রয়েছে । যেমনটি আপনি প্রত্যাশা করবেন, np.float32এটি একটি 32-বিট ভাসা।
ali_m

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
প্রকৃতপক্ষে, এটি দৃser়ভাবে দাবি করে যে পাঠক কম্পিউটারে যে পাইথন চলমান সেগুলি সম্পর্কে অবগত যেগুলি অন্তর্নিহিত বেস -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

বিটিডব্লিউ আপনার ক্রিয়াকলাপটি উত্থাপন করবে NameErrorযদি শর্তটি প্রথম whilemachine_epsilon = machine_epsilon_last = func(1)
চেকটিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.