الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ضرب عدد كبير من ال float يعطى Infinity !

مغلق
بدأه NUCLEAR في 10 يناير 2007 · 4 رد · 666 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدى برنامج يقوم بحساب محدد مصفوفه و هى تكون كبيره جدا 10000 * 10000 مثلا

و فى الخطوه النهائيه يضرب عناصر القطر الرئيسى فى بعض

احيانا تكون النتيجه Infinity !!

قمت بطباعه الأرقام وضربها ك Double فى برنامج اخر و اخرج النتيجه رقم

الأرقام هى :

-2.0 -0.5 6.0 3.0 2.7222223 2.6530612 2.6307693 2.622807 2.6209588 1.6176095 10.695767 3.8200417 3.2358673 3.1223722 3.0931702 3.0843284 3.0775409 3.0452483 1.8415587 2.9774346 3.7893898 3.473134 3.2876225 3.2108266 3.1789274 3.1628785 3.1458268 3.098619 1.9194189 2.6781569 3.267262 3.3160677 3.2676787 3.2279844 3.2031684 3.185488 3.16486 3.1172884 1.955271 2.5862312 3.1411476 3.2434826 3.2431772 3.226338 3.2098799 3.1943622 3.174465 3.129112 1.9755931 2.5491374 3.092404 3.2064135 3.2244806 3.2201734 3.2103574 3.1980858 3.1803036 3.1371813 1.988242 2.5313277 3.0687523 3.18557 3.2113454 3.2138307 3.208651 3.1993616 3.1837645 3.1425219 1.9962323 2.526761 3.0518312 3.1644464 3.1925344 3.1988735 3.197256 3.1908278 3.1774642 3.1378095 2.0019655 1.503651 1.6792104 1.7504289 1.7875993 1.8061647 1.8112304 1.8038733 1.7796926 1.7278873

و النتيجه غالبا صحيحه وهى 1.368991326019356E39

يمكنك التأكد من النتيجه ببرنامج صغيربعد استبدال المسافات بعلامات ضرب بمساعده اى محرر نصوص :

عرف Double و اسند حاصل الضرب اليه ثم اطبعه !

ما الحل غير استخدام ال Double؟

و ما الحل اذا كان الناتج اكبر من الDouble اساسا ؟

هل أقوم ببرمجهClass لحساب عمليات ضرب على BigNumber مكون من عدة Doubles ؟

تم تعديل هذه المشاركة بواسطة NUCLEAR في 10 يناير 2007 في 21:10

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#2

لم افهم المشكلة بالتحديد البرنامج يطبع قيمة الـ double دون مشكلة

اذا كنت تقصد كيف يمكن معرف النتيجة اذا كانت Infinityيمكنك استخدام الميثود

boolean bol= Double.isInfinite(d);

منقطع من حين لاخر

#3

لا المشكله تحديدا انه عند ضرب عناصر القطر و عددها يكون كبيرا فان قميه المتغير تتعدى الحد الأقصى !

و قد حللت المشكله والحمد لله

وهو حل مخصص للحاله التى اعمل عليها:

وهو وضع شرط يكشف اذا ما كان حاص الضرب تعدى المليون(أو أى من مضاعفات العشره) فيقوم بقسمته على 1000 (أو اى من مضاعفات العشره بقيمه مناسبه) و يقوم بزياده عداد من نوع int واحد

و فى النهايه يطبع 10^قيمه العداد*3 (اذا كان العدد الذى تقسم عليه 1000)

طبعا هناك ملاحظات:

1- قد يؤدى ذلك الى تقليل الدقه و لكن طول الDouble يضمن ابقاءها فى نطاق مقبول جدا جدا

2- اذا كنت ستستخدم حيله مشابهه فتأكد ان العدد الذى تقسم عليه ذو قيمه مناسبه حتى تتجنب تحويل القيمه الى عدد صغير جدا يمكن ان يهمل و تكون النتيجه صفر أو ان تكون كبيره جدا فتكون النتيجه Infinity

تم تعديل هذه المشاركة بواسطة NUCLEAR في 11 يناير 2007 في 19:28

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.
#4

هل استخدمت الفئه BigDecimal حيث انها اعطتني النتيجه التاليه :

1368991326019355988063691388938784604160

وان سمحت لي لماذا تريد استخدامه ، هل هذا مشروع أم مامناسبة الحديث عن برنامج يقوم بضرب العناصر القطريه الكبيره بالشكل هذا ؟

#5

هو بالتأكيد مشروع

و احدى الخطوات هى ايجاد محدد مصفوفه و التى قد تكون كبيره الحجم و بالتالى حل مجموعه معادلات خطيه

اما BigDecimal فلم استخدمه و و ليس من المجدى استخدامه اذ انه من الممكن ان يكون الناتج اكبر منه و كذلك Double يستطيع القيام بالمهمه ! والطريقه التى استخدمتها ناجحه 100%

شــــــكــــــــــــــــرا عـــــــــلــــــــــى اهـــــــتـــــــــــمــــــــامــــــــــــكـــــــــــــم

تم تعديل هذه المشاركة بواسطة NUCLEAR في 12 يناير 2007 في 00:18

Moore’s Law

– “Number of transistors in chips doubles every 18 
months”.
–  Every 10 years, processors are 100 times more 
powerful.

Gilder’s Law

– “Bandwidth grows at least three times faster than 
computer power”.
– Assuming bandwidth doubles every 12 months; 
every 10 years, it is 1000 times better.

هذا الموضوع مغلق.

مواضيع مشابهة