APIهای جبری ممیز شناور در Rust 1.98؛ معاملهٔ دقت با بردارسازی
بتای Rust 1.98 روشهای جبری جدیدی برای محاسبات ممیز شناور اضافه میکند تا کامپایلر بتواند عملیات را برای SIMD بازآرایی کند؛ در مقابل، تضمینهای عددی ضعیفتر میشوند.

بتای Rust 1.98 بهینهسازی محاسبات ممیز شناور را به یک انتخاب صریح در API تبدیل میکند. روشهای جدید algebraic_add، algebraic_sub، algebraic_mul و algebraic_div روی f32 به کامپایلر اجازه میدهند از قواعد جبری استفاده کند؛ قواعدی که برای عملگرهای معمول ممیز شناور همیشه مجاز نیستند.
دلیل اهمیت این تغییر آن است که محاسبات ممیز شناور مانند اعداد حقیقی رفتار نمیکنند. جابهجا کردن (a + b) + c به a + (b + c) میتواند نتیجهٔ گردکردن را تغییر دهد و مقادیری مانند NaN، بینهایت و صفر منفی نیز رفتار معمول اعداد را ندارند. مستندات بتای Rust میگویند عملیات جبری ممکن است عملیات را ترکیب یا بازآرایی کنند، تقسیم را به ضرب در معکوس تبدیل کنند و علامت صفر را نادیده بگیرند. هدف این است که امکان بردارسازی کد بیشتر شود.
بنابراین این قابلیت قراردادی برای بهینهسازی است، نه شکل سریعتر + یا *. برای نمونه، توسعهدهنده میتواند بنویسد:
let total = a.algebraic_add(b)
.algebraic_add(c)
.algebraic_add(d);
این کد اعلام میکند که شرکتپذیری ریاضی از بازتولید دقیق بیتبهبیت مهمتر است. کامپایلر همچنان آزاد است راهبرد بهینهسازی را انتخاب کند، بنابراین دقت دقیق نتیجه مشخص نیست. حتی ممکن است یک ورودی یکسان در طول اجرای یک برنامه، با تغییر تصمیمهای بهینهسازی، نتایج متفاوتی ایجاد کند. Rust تصریح میکند که این عملیات هرگز رفتار تعریفنشده ایجاد نمیکنند، اما کد unsafe نباید به مقدار خاصی از نتیجه تکیه کند.
برای هستههای عددی، گرافیک، شبیهسازی و بارهای کاری یادگیری ماشین، این قابلیت مرز روشنتری میان دو هدف ایجاد میکند: رفتار سختگیرانهٔ IEEE و محاسبات با توان عملیاتی بالاتر. اگر بازتولیدپذیری، رفتار صفر منفی، مدیریت NaN یا گردکردن پایدار بخشی از الگوریتم است، از عملگرهای معمول استفاده کنید. روشهای جبری را فقط زمانی به کار ببرید که الگوریتم تغییرات را تحمل کند و بنچمارکها سود واقعی نشان دهند.
از نظر زمانی، این نکته مهم است: صفحهٔ پیگیری انتشار، Rust 1.98 را هنوز منتشرنشده و زمان پایدارشدن آن را ۲۰ اوت ۲۰۲۶ اعلام میکند. مستندات بتا روشها را با برچسب 1.98.0 نشان میدهند، اما بتا بودن یعنی API و مستندات ممکن است تا زمان انتشار پایدار تغییر کنند. تیمهایی که این قابلیت را ارزیابی میکنند باید روی هدفهای پشتیبانیشدهٔ خود آزمایش کنند و هم عملکرد و هم خطای عددی را بسنجند.
درس گستردهتر این است که Rust فرضهای بهینهسازی را در کد منبع قابل مشاهده میکند. به جای پنهان کردن رفتار fast-math پشت پرچمی که کل ساخت را تحت تأثیر قرار میدهد، روشهای جدید اجازه میدهند تصمیم میان عملکرد و قطعیبودن، نزدیک خود محاسبه ثبت شود.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


