Loss of precision - int >شناور یا دو برابر

ساخت وبلاگ

من یک سؤال امتحانی دارم که در حال تجدید نظر هستم و سوال برای 4 مارک است.

"در جاوا می توانیم INT را به یک دو یا شناور اختصاص دهیم". آیا این هرگز اطلاعات را از دست می دهد و چرا؟

من این را بیان کرده ام زیرا INT به طور معمول از طول یا اندازه ثابت برخوردار است - دقت ذخیره داده ها محدود است ، جایی که ذخیره کردن اطلاعات در نقطه شناور می تواند بی نهایت باشد ، اساساً ما به دلیل این اطلاعات از دست می دهیم

اکنون من کمی ترسیم شده ام که آیا در اینجا به مناطق مناسب برخورد می کنم یا نه. من بسیار مطمئن هستم که این دقت را از دست می دهد اما دقیقاً نمی توانم انگشت خود را بر این دلیل بگذارم. لطفاً کمک کنم؟

شناور و دوتایی از دقت نامتناهی برخوردار نیستند. در این صورت ، آنها چیزهای جادویی خواهند بود که می توانند مقدار نامحدودی از اطلاعات را در فضای محدود حافظه ذخیره کنند.

نه ، نمی تواند. حداقل برای شناورهایی که در جاوا دارید نیست. برای حسابی دقیق دلخواه ، البته کلاس BigDecimal را دارید.

ذخیره یک INT در شناور که قبلاً هیچ چیز مفیدی را در خود جای نداده بود و پس از آن دور انداختن یا بازنویسی INT می تواند اطلاعات را از دست بدهد ، اما این عمل دور انداختن یا رونویسی از Int است که باعث از بین رفتن اطلاعات شده است-نه ذخیره شناور. برعکس ، بازنویسی هر متغیر از هر نوع که تنها کپی از چیزهای مفید را در اختیار داشته باشد می تواند باعث از بین رفتن اطلاعات شود ، حتی اگر متغیر برای ذخیره یک کپی کامل از اطلاعات در برخی متغیر دیگر ساخته شده باشد.

9 پاسخ 9

در جاوا عدد صحیح از 32 بیت برای نشان دادن مقدار آن استفاده می کند.

در جاوا یک شناور از یک مانتیسا 23 بیتی استفاده می کند ، بنابراین اعداد صحیح بیشتر از 2^23 حداقل بیت های قابل توجه خود را کوتاه می کنند. به عنوان مثال 33554435 (یا 0x200003) تا حدود 33554432 +/- 4 کوتاه می شود

در جاوا یک مضاعف از یک مانتیسا 52 بیتی استفاده می کند ، بنابراین می تواند یک عدد صحیح 32bit را بدون از دست دادن داده ها نشان دهد.

همچنین به "نقطه شناور" در ویکی پدیا مراجعه کنید

مانتیسا در واقع 24 و 53 بیت برای شناور و دو برابر است. فقط این است که بالاترین بیت در نمایندگی ذخیره نمی شود ، زیرا نیازی به آن نیست (همیشه 1 است).

لازم نیست که طرح داخلی شماره های نقطه شناور را بدانید. تمام آنچه شما نیاز دارید اصل کبوتر و دانش است که int و float به همان اندازه هستند.

  • int یک نوع 32 بیتی است ، که برای هر الگوی بیت یک عدد صحیح مشخص را نشان می دهد ، بنابراین 2^32 مقادیر int وجود دارد.
  • Float یک نوع 32 بیتی است ، بنابراین حداکثر 2^32 مقادیر مجزا را دارد.
  • برخی از شناورها نمایانگر غیر اینتگرها هستند ، بنابراین کمتر از 2^32 مقادیر شناور وجود دارد که نمایانگر اعداد صحیح هستند.
  • بنابراین ، مقادیر مختلف INT به همان شناور تبدیل می شوند (= از دست دادن دقت).

استدلال مشابه می تواند با طولانی و دو برابر استفاده شود.

این چیزی است که JLS در مورد موضوع (در یک بحث غیر فنی) می گوید.

JLS 5. 1. 2 گسترش بدوی

  • int به طولانی ، شناور یا دو برابر
  • (استراحت حذف شده)

نه ، شناور و دو برابر نیز به طول ثابت هستند - آنها فقط از بیت های خود متفاوت استفاده می کنند. اطلاعات بیشتر در مورد چگونگی عملکرد آنها در راهنمای شناور شناور را بخوانید.

در اصل ، شما نمی توانید هنگام اختصاص Int به یک Double ، دقت خود را از دست دهید ، زیرا Double دارای 52 بیت دقت است که برای نگه داشتن تمام مقادیر INT کافی است. اما Float فقط 23 بیت دقت دارد ، بنابراین دقیقاً نمی تواند تمام مقادیر INT را که بزرگتر از حدود 2^23 است ، نشان دهد.

به جای اینکه بگوییم نمی تواند مقادیر int را بزرگتر از 2^23 نگه دارد ، دقیق تر می توان گفت که دامنه اعداد صحیح متوالی از دقیقاً ا ز-2^24 تا +2^24 گسترش می یابد. این مقادیر و تمام مقادیر بین آنها در شناور قابل نمایش هستند. نزدیکترین عدد صحیح در زیر این محدوده نیست.

شهود شما صحیح است ، ممکن است هنگام تبدیل int به شناور ، دقت خود را از دست دهید. با این حال به همان سادگی نیست که در اکثر پاسخ های دیگر ارائه شده است.

در جاوا یک شناور از یک مانتیسا 23 بیتی استفاده می کند ، بنابراین اعداد صحیح بیشتر از 2^23 حداقل بیت های قابل توجه خود را کوتاه می کنند.(از یک پست در این صفحه)

درست نیست. مثال: در اینجا یک عدد صحیح از 2^23 وجود دارد که بدون ضرر به یک شناور تبدیل می شود:

بنابراین ، درست نیست که اعداد صحیح بیشتر از 2^23 حداقل بیت های قابل توجه خود را کوتاه می کنند.

بهترین توضیحی که پیدا کردم در اینجا است: یک شناور در جاوا 32 بیتی است و توسط: علامت * Mantissa * 2^علامت Exponent * (0 تا 33_554_431) * 2^(-125 تا +127) منبع: http://www. ibm.com/developerworks/java/library/j-math2/index.html

چرا این یک مسئله است؟این تصور را به وجود می آورد که شما می توانید تعیین کنید که آیا از بین رفتن دقت از int به شناور فقط با دیدن اینکه int چقدر بزرگ است ، وجود دارد. من به خصوص سؤالات امتحان جاوا را دیده ام که از آن سؤال می شود که آیا یک INT بزرگ بدون ضرر به شناور تبدیل می شود.

همچنین ، گاهی اوقات افراد تمایل دارند فکر کنند که از بین رفتن دقت از int به شناور وجود خواهد داشت: هنگامی که یک int بزرگتر از: 1_234_567_890 صحیح نیست (به نمونه بالا در بالا مراجعه کنید) هنگامی که یک int بزرگتر از: 2 Exponent 23 (برابر: 8_388_608 است.) درست نیست وقتی یک int بزرگتر از: 2 Exponent 24 (برابر: 16_777_216) درست نیست

نتیجه گیری تبدیل از INT به اندازه کافی بزرگ به شناورها ممکن است دقت را از دست بدهد. نمی توان تعیین کرد که آیا فقط با دیدن اینكه INT چقدر بزرگ است (یعنی بدون تلاش برای عمیق تر شدن به نمایندگی واقعی شناور ، ضرر خواهد شد.

استراتژی‌های اسکالپ...
ما را در سایت استراتژی‌های اسکالپ دنبال می کنید

برچسب : نویسنده : ناصر تقوایی بازدید : 36 تاريخ : جمعه 5 خرداد 1402 ساعت: 18:06