رفتن به محتوای اصلی
بازگشت به وبلاگ

داده و اتصال فنی

تفاوت math.isclose و numpy.isclose؛ تلورانس را چطور انتخاب کنیم؟

تفاوتِ NumPy وmath.isclose را با جابه‌جاییِ مرجع،صفر و زنجیرهٔ غیرتعدی ببینید؛۵۸۸ مقایسهٔ محدود و مرجعِ کسرِ دقیق همراه‌اند.

«تقریباً برابر» یک قراردادِ مقایسه است، نه همان برابریِ دقیقِ عددها. در NumPy، عددِ مرجع در بخشِ نسبیِ isclose اهمیت دارد؛ math.isclose فرمولِ متقارنِ دیگری دارد. با سه شاهدِ مستقل می‌بینیم که عوض‌کردنِ ترتیب، نزدیکِ صفر بودن و زنجیرهٔ مقایسه می‌توانند نتیجه را عوض کنند.

کدام عدد مرجع است؟

برای عددهای متناهی، قاعدهٔ NumPy اختلافِ مطلق را با atol+rtol×|b| می‌سنجد. a و b دو ورودی‌اند و b مرجعِ مقیاسِ نسبی است. در مقابل، math.isclose از max(atol، rtol×max(|a|، |b|)) استفاده می‌کند. اینجا هم جمع با بیشینه فرق دارد و هم انتخابِ مرجع.

در تمرینِ اصیل a=۱، b=۲، rtol=۰٫۷۵ و atol=۰ است. اختلاف ۱ وحدِ مجازِ NumPy برابر ۱٫۵ می‌شود؛ نتیجه True است. با عوض‌کردنِ دو ورودی، اختلاف همان ۱ ولی حد ۰٫۷۵ می‌شود و نتیجه False است. math.isclose در هر دو جهت True می‌دهد؛ بنابراین تفاوت فقط خطای گردکردن نیست.

صفر، مرجعِ نسبیِ کوچکی است

در اجرایِ واقعی، np.isclose(۱ e−۹، ۰) با پیش‌فرض True است؛ با atol=۰ همان مقایسه False می‌شود. math.isclose پیش‌فرض نیز False می‌دهد. نزدیک‌بودنِ مطلق به صفر، با کوچک‌بودنِ اختلاف نسبت به مرجع یکی نیست؛ عددِ نمونهٔ ما هیچ واحد یا کاربردِ مالی ندارد.

اگر واحدِ داده عوض شود، حدِ مطلق نیز نیاز به بازنگری دارد. در کد، ۱ و ۱٫۰۵ با atol=۰٫۱ پذیرفته می‌شوند، اما ۱۰۰۰ و ۱۰۵۰ با همان حد رد می‌شوند. نسبت یکسان است؛ اندازهٔ اختلافِ مطلق یکسان نیست. از این شاهد، تلورانسِ مناسبِ هر مسئله را نمی‌توان استخراج کرد.

زنجیره، برابریِ قابلِ اعتماد نمی‌سازد

سه عدد ۰، ۰٫۰۶ و ۰٫۱۲ را با atol=۰٫۱ و rtol=۰ مقایسه می‌کنیم. دو جفتِ همسایه نزدیک‌اند، اما دو سرِ زنجیره نزدیک نیستند. نتیجهٔ واقعی[True، True، False] است. پس رابطهٔ نزدیکی در این مثال تعدی ندارد؛ جانشینِ بی‌طراحیِ برابری برای set، شناسه یا حذفِ تکرار نیست.

شاهدنتیجهٔ اجرا
۱ به ۲ و ۲ به ۱ در NumPyTrue و False
۱ e−۹ به ۰، پیش‌فرض/فقط نسبیTrue و False
زنجیرهٔ سه‌عددیدو همسایه True، دو سر False

مرجعِ کسرِ دقیق را جدا بخوانیم

کد هر float ورودی را به Fraction همان نمایشِ باینری تبدیل می‌کند. تمام ۵۸۸ حالتِ شبکهٔ کوچک با دو فرمولِ مستقل و اجرایِ واقعیِ NumPy و math برابرند. عددهایِ آن شبکه دقیقاً قابلِ نمایش‌اند؛ این آزمایش اثباتِ یکسان‌بودنِ همهٔ محاسبه‌هایِ گرد‌شده در هر مرز نیست.

مرزِ جدا ۱ با ۱٫۱۲۵ و atol=۰٫۱۲۵ هم پذیرفته می‌شود. این مقادیرِ باینریِ دقیق، معنایِ «کوچک‌تر یا مساوی» را روشن می‌کنند. جمعِ ممیزشناور منشأ اختلافِ محاسبه و Decimal از رشته معنایِ دهدهی را می‌سنجد؛ اینجا دو مقدارِ موجود را مقایسه می‌کنیم.

نوع و مقدارِ ویژه را صریح کنیم

پوششِ محدودِ ما اسکالرِ متناهی با قدرمطلقِ حداکثر یک‌میلیون، تلورانسِ نامنفی، rtol کوچک‌تر از ۱ و atol حداکثر ۱ می‌پذیرد. هشت حالتِ نامعتبر، از bool و آرایه تا NaN وحدِ منفی، رد می‌شوند. این ردهای محلی به معنیِ ناتوانیِ عمومی NumPy در آرایه یا bool نیستند.

بیرونِ پوشش، رفتارِ کتابخانه نیز جدا ثبت شده: NaN با خودش پیش‌فرض False و با equal_nan=True برابر True است؛ مثبتِ بی‌نهایت با خودش True و با منفیِ بی‌نهایت False است. اجرا NumPy۲٫۳٫۵ و Python۳٫۱۲٫۱۴ است. این‌ها معیارِ کیفیتِ مدل یا صوت نیستند. ادامه در مبانی هوش مصنوعی؛ پیش از ارزیابیِ خروجیِ عددی، واحد، مرجع و سیاستِ مقایسه را بنویسید.

فایل تمرین و منبع

کد کاملِ تمرینِ مستقل و کنترل‌ها؛ Python · ورودی و تمامِ خروجیِ اجرای واقعی؛ JSON

منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثال‌ها و فایل‌های این راهنما آموزشی و ساختهٔ تحریریه‌اند.

برای این نیاز، کدام خدمت مناسب‌تر است؟

تماس و منشی، چت سایت و تحلیل مکالمه سه مسیر متفاوت‌اند. ابتدا خدمت متناسب نیازتان را انتخاب کنید.

انتخاب میان سه خدمتراهنمای شروع با تیم اپرا

برآورد هزینه