CodeGym /وبلاگ جاوا /Random-FA /کلمه کلیدی جاوا شناور
John Squirrels
مرحله
San Francisco

کلمه کلیدی جاوا شناور

در گروه منتشر شد
در مرحله ای از توسعه فناوری محاسبات، مشخص شد که واحدهای پردازش مرکزی برای پردازش اعداد ممیز شناور به دستگاه های سخت افزاری نیاز دارند. امروزه تمام معماری های کامپیوتری می توانند با چنین اعدادی به طور موثر کار کنند. البته در زبان های برنامه نویسی نیز نمی توانید بدون انواع داده های مربوطه کار کنید. دو نوع داده ممیز شناور در جاوا وجود دارد: float و double. کلمه کلیدی Java Float یک عدد واقعی را تعریف می کند که 32 بیت در حافظه اشغال می کند. در این مقاله در مورد چنین اعدادی صحبت خواهیم کرد.

اعداد اعشاری. اعداد واقعی چگونه در کامپیوتر ذخیره می شوند؟

برای ذخیره اعداد واقعی در حافظه کامپیوتر، تعداد معینی بیت تخصیص داده می شود. یک عدد واقعی به عنوان علامت (بعلاوه یا منهای)، آخوندک و توان ذخیره می شود. اینکه آخوندک و نما چیست به بهترین وجه با یک مثال توضیح داده می شود. جرم تقریبی ماه 7*1022 است. در اینجا 7 آخوندک است و در 22 شار. هنگام نمایش اعداد بزرگ یا بالعکس، بسیار کوچک بر روی صفحه، می توانید ورودی مانند 7E22 را مشاهده کنید. این عدد ممیز شناور است و 7 در اینجا آخوندک است و 22 توان یا توان 10 است. به این نماد نماد نمایی می گویند.

کلیدواژه شناور جاوا و کلمه کلیدی دوگانه جاوا

مقادیر شناور (اعداد ممیز شناور یا اعداد واقعی) در جاوا با انواع float و double نشان داده می شوند . این کلمات کلیدی هستند که برای ذخیره مقادیر تا یک علامت خاص پس از نقطه اعشار استفاده می شوند. double اعدادی با دقت مضاعف هستند که تا حد امکان نزدیک به مقادیر داده شده یا به دست آمده در نتیجه محاسبات هستند. جاوا Double برای هر گونه محاسبات ریاضی (ریشه مربع، سینوس، کسینوس، ..) و همچنین برای همه محاسباتی که دقت خاصی مهم است استفاده می شود. نوع داده شناور برای نوع ممیز شناور دقیق تر استفاده می شود. به ندرت برای صرفه جویی در حافظه استفاده می شود. در زیر جدولی با اطلاعات اصلی در مورد float و double و همچنین تفاوت‌های آنها داریم.
شناور دو برابر
اصلی Float یک مقدار تک دقیق است این یک مقدار با دقت دوگانه است
اندازه پیش فرض 4 بایت (32 بیت) 8 بایت (64 بیت)
مقدار پیش فرض 0.0f 0.0
دامنه از 1.4e–045 تا 3.4e+038 از 4.9e–324 تا 1.8e+308
چه چیزی برای آن استفاده می شود برای ذخیره حافظه برای کار با اعداد کسری نسبتاً دقیق
بنابراین کلمه کلیدی Float به معنای یک عدد است، یک مقدار تک دقیق که 32 بیت یا 4 بایت در حافظه می گیرد. در برخی از پردازنده‌ها، کار با چنین اعدادی سریع‌تر است، و همانطور که قبلاً ذکر شد، در مقایسه با اعداد با دقت مضاعف، فضای کمتری را اشغال می‌کنند. با این حال، نمی توان به طور واضح با سرعت گفت. بیایید بگوییم که برخی از پردازنده های مدرن دقیقاً اعداد را با دقت دو برابر سریعتر پردازش می کنند.

جاوا شناور و اعلامیه دوگانه

می توانید تعدادی از نوع را به همان ترتیبی که اعداد انواع دیگر را دو برابر می کنند ، اعلام کنید:
double myDouble = 2.7;
با این حال، اگر یک عدد ممیز شناور را به این شکل نشان دهید، کامپایلر از شما می خواهد که نوع عدد را به دو برابر تغییر دهید. در اینجا یک مثال نادرست از متغیر float آورده شده است:
public class FloatExample {
   public static void main(String[] args) {
//double and float variables
       double myDouble = 2.7;
       float myFloat = 3.14;
   }
}
اگر این برنامه را اجرا کنید چه اتفاقی می افتد:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
واقعیت این است که استفاده از اعداد شناور نامطلوب است و این باید فقط برای صرفه جویی در حافظه انجام شود. تمام اعداد کسری واقعی در جاوا به طور پیش فرض Double هستند و نحو زبان نیز بر این موضوع تاکید دارد. اگر واقعاً می خواهید با نوع float کار کنید، باید آن را به صراحت با یک f که عدد را خاتمه می دهد مشخص کنید.
public class FloatExample {
   public static void main(String[] args) {
//double and float variables
       double myDouble = 2.7;
       float myFloat = 3.14f;
   }
}
به هر حال، اعداد شناور و دوگانه را می توان به صورت نمایی نوشت.
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
اگر از اعداد به اندازه کافی بزرگ در نمایش "عادی" آنها استفاده کنید، جاوا آنها را بلافاصله به صورت نمایی نمایش می دهد. بیایید مثالی بزنیم:
public class FloatExample {
   public static void main(String[] args) {
//float variables
               float myFloatNumber1=2182818284590.45f;
               float myFloatNumber2=19822612787260.141592181f;
               System.out.println("myFloatNumber1 = " + myFloatNumber1);
               System.out.println("myFloatNumber2 = " + myFloatNumber2);
       System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
           }
       }
نتیجه کار این برنامه اینجاست:
myFloatNumber1 = 2.1828183E12 myFloatNumber2 = 1.98226121E13 myFloatNumber1 + myFloatNumber2 = 2.1828183E121.98226121E13

مثال شناور ویژه و اعداد دوتایی

سه عدد ممیز شناور ویژه در زبان جاوا وجود دارد که برای نشان دادن سرریزها و خطاها استفاده می شود. آن ها اینجا هستند:
  • بی نهایت مثبت حاصل تقسیم یک عدد مثبت بر 0 است. با ثابت های Double.POSITIVE_INFINITY و Float.POSITIVE_INFINITY نمایش داده می شود .

  • بی نهایت منفی حاصل تقسیم یک عدد منفی بر 0 است. که با ثابت های Double.NEGATIVE_INFINITY و Float.NEGATIVE_INFINITY نشان داده می شود .

  • NaN (نه یک عدد) نشان دهنده محاسبه 0/0 یا گرفتن جذر یک عدد منفی است. با ثابت های Double.NaN و Float.NAN نشان داده می شود .

در اینجا نمونه ای از استفاده از این اعداد ممیز شناور ویژه آورده شده است:
public class FloatExample {
   public static void main(String[] args) {
       int myInt = 1;
       float zero = 0.0f;
       double negZero = -0.0;
       double negativeInfinity = Double.NEGATIVE_INFINITY;
       double positiveInfinity = Float.POSITIVE_INFINITY;

       System.out.println(myInt / zero);
       System.out.println(myInt / negZero);
       System.out.println(zero == negZero);
       System.out.println(negativeInfinity * 0);
       System.out.println(positiveInfinity+negativeInfinity);

   }
}
نتیجه این است:
بی نهایت -بی نهایت درست NaN NaN

آیا دقت مضاعف کافی است؟

در واقع، با وجود دقت مضاعف نوع Double ، استفاده از اعداد ممیز شناور، به عنوان مثال، در محاسبات مالی، بهترین ایده نیست زیرا خطاهای گرد کردن قابل قبول نیستند. پس سعی کنید خروجی برنامه زیر را روی صفحه نمایش دهید.
public class FloatExample {
   public static void main(String[] args) {
       System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
   }
}
شما نتیجه زیر را دریافت خواهید کرد:
2.0 - 1.1 = 0.8999999999999999
منطقی است که فرض کنیم نتیجه 0.9 خواهد بود. با این حال، چنین خطاهایی بسیار رایج هستند و با نمایش دودویی داخلی اعداد مرتبط هستند. برای مثال، نمی‌توانیم مقدار دقیق ⅓ را به عنوان کسر اعشاری نشان دهیم. البته محدودیت های مشابهی در سیستم باینری وجود دارد. اگر این کار نیاز به حذف خطاهای گرد کردن دارد، جاوا کلاس BigDecimal را برای این کار دارد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION