«تقریباً برابر» یک قراردادِ مقایسه است، نه همان برابریِ دقیقِ عددها. در 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، شناسه یا حذفِ تکرار نیست.
| شاهد | نتیجهٔ اجرا |
|---|---|
| ۱ به ۲ و ۲ به ۱ در NumPy | True و 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
- NumPy۲٫۳؛ تعریفِ مرجع b، هشدارِ پیشفرضِ نزدیک صفر و NaN خوانده شد؛ اجرایِ واقعی ۲٫۳٫۵ است
- مستندِ رسمیِ math.isclose؛ فرمول متقارن و سیاستِ عددهای ویژه خوانده شد؛ شاخهٔ مستند ۳٫۱۲٫۱۶ با اجرای ۳٫۱۲٫۱۴ یکی ادعا نشده
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.