لمحة جافاوية 43: الأعداد الكبيرة

السلام عليكم

كيف حالكم جميعاً
طبعاً كعادتي أطلت عليكم الغياب
لكن ويعلم الله أني هذه المرة لا ذنب لي بالمرة
ذنبي الوحيد هذه المرة
هو أني أعيش في غزة
طبعاً التيار الكهربائي هو السبب
يبدو أنه قرر أن يعتبر نفسه من العملات النادرة
وإن كنت أكاد أجزم أنه مسكين مثلي
ربما هو السولار فهو سيئ الطباع
ولا يكف عن أن يعتبره نفسه مهماً
وأنه ليس الجميع يستحقون الحصول عليه
وإن كنت أظنه مجرد متورط في موضوع أكبر منه
طبعاً عندما تبحث عن المسؤول الرئيسي عن كل هذا
يكف الجميع عن التواجد ويتبين أنك المخطئ الوحيد
على كل حال أرجو أن تعذروني
اليوم أتكلم معكم عن الأعداد الكبيرة جداً
قديماً عندما كنت تحتاج إلى إجراء عمليات تفوق حجم long
كنت ستموت كمداً وأنت تحاول مع الإخوة
المكمل الأول one’s complement و المكمل الثاني two’s complement
عدا عن عمليات الضربة والقسمة وخلافه
تصوروا معي حجم المعاناة التي كنت ستعانيها
وفي النهاية لن تتأكد من الشيفرة الخاصة بك
وستبقى هواجس الخطأ تلاحقك في كل مكان
على كل حال مع ظهور الجافا إلى الدنيا فالوضع اختلف بالكلية
(بالطبع أظن C# مثل جافا في كل شيء لا أعرف لماذا أحس أنها نسخة سيئة منها :P )
للدقة في الإصدارة 1.1 من جافا
قدمت جافا الحزمة java.math
وقدمت فيها الفئتين BigInteger و BigDecimal
هاتان الفئتان تمثل الأعداد الكبيرة جداً
وتقوم بعمليات الجمع والطرح والضرب والقسمة
بل وباقي القسمة والقاسم المشترك الأكبر وفحص الأعداد الأولية prime
بل وعمليات الإزاحة بل وحتى المقارنة
والكثير من العمليات الأخرى
الفرق بين هذه الفئات وبين المتغيرات من نوع int و long و float و double
هو لا وجود لحد بمعنى آخر لا وجود لمفهوم زيادة التدفق overflow
هذا مثال بسيط على الموضوع

package BigInteger;

import java.math.BigDecimal;
import java.math.BigInteger;

public class Test {
	public static void main(String[] args) {
		BigInteger b1=new BigInteger("10");
		b1.add(new BigInteger("10"));
		System.out.println(b1);
		b1.subtract(new BigInteger("10"));
		System.out.println(b1);
		b1=b1.abs();//return BigInteger
		System.out.println(b1);
		b1.and(b1);
		System.out.println(b1);
		b1.or(b1);
		System.out.println(b1);
		System.out.println(b1.compareTo(new BigInteger("10")));
		BigDecimal b2=new BigDecimal("10");
		b2.add(new BigDecimal("10"));
		System.out.println(b2);
		b2.subtract(new BigDecimal("10"));
		System.out.println(b2);
		b2=b2.abs();//return BigDecimal
		System.out.println(b2);
		System.out.println(b2.compareTo(new BigDecimal("10")));
	}
}

ملاحظة أخيرة:
الفئة BigDecimal تختلف عن BigInteger في كونها تتعامل مع الأعداد العشرية
أوف بهذا أنهينا هذه اللمحة السريعة
صحيح أنها مفيدة جداً
لكن يمكن تصنيفها في تصنيف للمبتدئين فقط
(أكيد الأخ عبده واحد منهم)
يبدو أني تكلمت كثيراً المرة
(قرفتنا يا مقرف لكن وياللعجب كنت مفيداً)
الحمد لله أن الأخ عبده قرر الرضا علينا
اللهم احفظها نعمة
اترككم في أمان الله

تحياتي

Tags: , , , , , , , ,

4 Responses to “لمحة جافاوية 43: الأعداد الكبيرة”

  1. abuoof قال:

    جزاك الله خير
    أول مرة أعرف ان في حاجة أكبر من ال long & double والسبب أني محتجتش حاجة اكبر منهم كي أبحث عنها
    ممكن تخبرني كيف أختبر العدد إذا كان أولي أو لا؟
    c# كما تقول ولكنها تستخدم المؤشرات مما يجعلها اسرع من الجافا في التعديل علي الصور
    متأسف جبت الرد بالمعكوس من تحت إلي فوق
    رزقك الله الصبر والتفاؤل

  2. admin قال:

    أجمعين يا رب
    لاحظ أنك لم تعمل على عمليات كبيرة
    تصور العملية التالية
    100000000000^2
    ناتج خيالي
    لكن هناك عمليات تحتاجها بشدة
    مثل المضروب
    لاحظ التالي 10! = عدد خيالي
    بالنسبة لموضوع العدد الأولي
    العدد الأولي هو العدد الذي يقسم على نفسه وعلى الواحد فقط
    طبعاً أي عدد لتفحص أنه أولي يجب أن تتأكد من الشرط السابق
    بالنسبة لموضوع c#
    المشكلة في اللغات الجديدة سواءاً كانت java أو c# أو ختى air
    هي الطبقة التي تضعها بين البرنامج والعتاد
    وهذا يؤدي إلى تأخر في تنفيذ العمليات
    نأتي للسؤال اللماذا c# أسرع من جافا؟
    ببساطة c# مدعومة في نواة ويندوز
    طبعاً بالإضافة إلى موضوع المؤشرات

    تحياتي

  3. abuoof قال:

    عندك حق ولاكن آخرنا في الكلية جمع عددين D:
    بالنسبة للعدد الأولي أعرف قانونه ولكني كنت أظن ميثود جاهزة
    بالنسبة السي شارب : لهذا تقترب سرعة الاثنان في اللينكس؟؟؟ أظن أني فهمت
    وجزاك الله خير

  4. admin قال:

    اهااااا
    صحيح هناك دالة جاهزة لذلك
    أظن isPrime

    تحياتي

Leave a Reply