مسیر
/
Rust
Rust
/
برنامه‌ی درسی
/
اعداد ممیز شناور
اع

اعداد ممیز شناور در Rust

1 تمرین

درباره‌ی اعداد ممیز شناور

عددهای شناور، اعداد حقیقی هستند: می‌توانند بخش اعشاری داشته باشند. این عددها در ماشین با استفاده از مشخصات IEEE-754 و به‌صورت الگویی از بیت‌های دودویی نمایش داده می‌شوند. معمولاً به عددهای شناور، float می‌گویند.

عددهای شناور همیشه علامت‌دار هستند. علامت‌دار بودن یعنی یکی از بیت‌های عدد کنار گذاشته می‌شود تا نشان دهد آن عدد منفی است یا نه.

عددهای شناور یک عرض بیت دارند که همان تعداد بیت‌های سازنده‌ی آن عدد است. این موضوع بر بازه و دقت مقدارهایی اثر می‌گذارد که آن نوع می‌تواند نمایش دهد.

Rust دو نوع اولیه‌ی شناور دارد: f32 و f64. عددی که بعد از f می‌آید، عرض بیت را نشان می‌دهد. در زبان‌های دیگر، به f32 گاهی «دقت تک» و به f64 گاهی «دقت مضاعف» می‌گویند.

از کدام‌یک استفاده کنم؟

به‌طور کلی از f64 استفاده کنید: روی بیشتر سخت‌افزارهای مصرفی مدرن به‌سرعتِ f32 است و بروز بی‌دقتی عددهای شناور را به‌شکل چشمگیری کاهش می‌دهد.

اگر به عددهای گویا با دقت بی‌نهایت نیاز دارید، می‌توانید از کریت num-rational استفاده کنید که نوع BigRational را فراهم می‌کند. اگر به عددهای اعشاری با دقت ثابت نیاز دارید، می‌توانید از کریت rust_decimal استفاده کنید که نوع Decimal را فراهم می‌کند.

تبدیل بین عددهای شناور

Rust هیچ تبدیل عددی ضمنی ندارد. اگر لازم است بین نوع‌های شناور تبدیل نوع انجام دهید، دو راهبرد اصلی وجود دارد: کلیدواژه‌ی as و تریت‌های From و TryFrom.

استفاده از کلیدواژه‌ی as ساده است: expr as Type. اما نکته‌ها و ظرافت‌های متعددی وجود دارد که هنگام تبدیل نوع با as باید در نظر داشته باشید.

تبدیل نوع مبتنی بر تریت کمی پیچیده‌تر است، اما ایمن‌تر: تریت‌های تبدیل فقط جایی پیاده‌سازی شده‌اند که ایمن باشند. برای مثال، f32 برای From<u8>، From<u16>، From<i8> و From<i16> پیاده‌سازی شده است: هر مقداری که هر یک از این نوع‌ها بتواند نمایش دهد، تضمین می‌شود که در f32 هم قابل نمایش باشد. می‌توان از آن به شکل f32::from(expr) یا expr.into() استفاده کرد، که در آن expr یکی از همان نوع‌هاست.

وقتی مقدارهای شناور را تبدیل می‌کنید، تبدیل نوع با as بیشتر ترجیح داده می‌شود، فقط به این دلیل که پیاده‌سازی‌های تبدیل نوع مبتنی بر تریت نسبتاً کم هستند. تا اکتبر ۲۰۲۰، TryFrom برای عددهای شناور پیاده‌سازی نشده است. تبدیل نوع با as از f32 به f64 بدون اتلاف است. تبدیل برعکس با اتلاف همراه است، اما پروتکل تبدیل تعریف‌شده‌ای دارد که هدفش کمینه کردن اتلاف است.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود