لماذا الرياضيات.الجذر التربيعي(i*i).الكلمة == أنا ؟

StackOverflow https://stackoverflow.com/questions/2060486

  •  20-09-2019
  •  | 
  •  

سؤال

وأنا أتساءل إذا كان هذا صحيحا:عندما أخذ الجذر التربيعي تربيع عدد صحيح مثل

f = Math.sqrt(123*123)

سوف تحصل على النقطة العائمة رقم قريب جدا 123.بسبب النقطة العائمة التمثيل الدقة, هذا يمكن أن يكون شيئا مثل 122.99999999999999999999 أو 123.000000000000000000001.

منذ floor(122.999999999999999999) هو 122 ، يجب على 122 بدلا من 123.لذلك أتوقع أن floor(sqrt(i*i)) == i-1 في حوالي 50% من الحالات.الغريب, جميع الأرقام يجب اختبارها ، floor(sqrt(i*i) == i.هنا صغيرة روبي النصي لاختبار أول 100 مليون دولار أرقام:

100_000_000.times do |i|
  puts i if Math.sqrt(i*i).floor != i
end

السيناريو أعلاه لم يطبع أي شيء.لماذا هو كذلك ؟

تحديث: شكرا على الرد السريع, يبدو أن هذا هو الحل:وفقا ويكيبيديا

أي عدد صحيح مع القيمة المطلقة أقل من أو يساوي 2^24 يمكن أن يكون بالضبط ممثلة في دقة واحدة شكل و أي عدد صحيح مع المطلق قيمة أقل من أو يساوي 2^53 يمكن يكون بالضبط ممثلة في ضعف الدقة الشكل.

الرياضيات.الجذر التربيعي(i*i) يبدأ في التصرف كما كنت أتوقع بدءا من أنا=9007199254740993 الذي هو 2^53 + 1.

هل كانت مفيدة؟

المحلول

ل "الصغيرة" الاعداد الصحيحه ، عادة ما يكون هناك بالضبط تمثيل الفاصلة العائمة.

نصائح أخرى

هنا هو جوهر من الارتباك:

بسبب النقطة العائمة التمثيل الدقة, هذا يمكن أن يكون شيئا مثل 122.99999999999999999999 أو 123.000000000000000000001.

هذا هو زائف.وسوف يكون دائما بالضبط 123 على IEEE-754 المتوافقة مع النظام ، وهو ما يقرب من جميع الأنظمة في هذه الأزمنة الحديثة.حساب الفاصلة العائمة لا يكون "خطأ عشوائي" أو "الضوضاء".وقد دقة ، القطعية التقريب ، و العديد من حسابات بسيطة (مثل هذا واحد) لا تتحمل أي التقريب على الإطلاق.

123 هو بالضبط قابل للتمثيل في النقطة العائمة, وذلك هو 123*123 (حتى هي كل متواضعة الحجم الصحيحه).لذلك لا التقريب يحدث خطأ عند تحويل 123*123 إلى النقطة العائمة نوع.والنتيجة هي بالضبط 15129.

الجذر التربيعي هو تقريب بشكل صحيح العملية في IEEE-754 القياسية.وهذا يعني أنه إذا كان هناك إجابة محددة ، الجذر التربيعي وظيفة مطلوب لتحقيق ذلك.منذ كنت تأخذ الجذر التربيعي بالضبط 15129, الذي هو بالضبط 123, ، بالضبط النتيجة التي تحصل عليها من الجذر التربيعي وظيفة.لا التقريب أو تقريب يحدث.

الآن كم كبير من عدد صحيح سوف يكون هذا صحيحا ؟

الدقة المزدوجة يمكن أن تمثل بالضبط كل الصحيحه يصل إلى 2^53.طالما i*i هو أقل من 2^53 التقريب سوف تحدث في حساب, و سوف تكون النتيجة بالضبط لهذا السبب.وهذا يعني أن كل i أصغر من 94906265, نحن نعلم حساب سوف تكون دقيقة.

ولكن هل حاولت i أكبر من ذلك!ماذا يحدث ؟

أكبر i التي حاولت ، i*i هو بالكاد أكبر من 2^53 (1.1102... * 2^53, في الواقع).لأن التحويلات من عدد صحيح إلى ضعف (أو الضرب المزدوج) أيضا تقريب بشكل صحيح العمليات ، i*i سوف يكون قابل للتمثيل القيمة الأقرب إلى نفس مربع i.في هذه الحالة, حيث i*i 54 اجزاء واسعة ، التقريب سيحدث في أدنى قليلا.وبالتالي نحن نعرف أن:

i*i as a double = the exact value of i*i + rounding

حيث rounding إما -1,0, or 1.إذا التقريب هو صفر ، ثم متر بالضبط ، لذلك الجذر التربيعي هو بالضبط, لذلك نحن نعلم بالفعل يمكنك الحصول على الجواب الصحيح.دعونا نتجاهل هذه الحالة.

حتى الآن نحن نبحث عن الجذر التربيعي i*i +/- 1.باستخدام سلسلة تايلور التوسع بلا حدود الدقيقة (unrounded) قيمة هذا الجذر التربيعي هو:

i * (1 +/- 1/(2i^2) + O(1/i^4))

الآن هذا هو ذكي قليلا لمعرفة ما إذا كنت لم تفعل أي النقطة العائمة تحليل الأخطاء من قبل ، ولكن إذا كنت تستخدم حقيقة أن i^2 > 2^53, يمكنك أن ترى أن:

1/(2i^2) + O(1/i^4)

المصطلح هو أصغر من 2^-54 ، وهو ما يعني أن (منذ الجذر التربيعي هو تقريب بشكل صحيح ، ومن ثم خطأ التقريب يجب أن يكون أصغر من 2^54) ، تقريب نتيجة الجذر التربيعي وظيفة بالضبط i.

اتضح أن (مع تحليل مماثل) ، أي بالضبط قابل للتمثيل النقطة العائمة عدد x, sqrt(x*x) هو بالضبط x (على افتراض أن متوسط حساب x*x لا أكثر أو تجاوز الحد الأدنى) ، وبالتالي فإن الطريقة الوحيدة التي يمكن أن تواجه التقريب لهذا النوع من الحساب هو في تمثيل x نفسه ، الذي هو السبب في أنك ترى ذلك ابتداء من الساعة 2^53 + 1 (أصغر unrepresentable عدد صحيح).

فإنه ليس من الصعب جدا العثور على الحالات التي يكون فيها هذا ينهار كما كنت تتوقع:

Math.sqrt(94949493295293425**2).floor
# => 94949493295293424
Math.sqrt(94949493295293426**2).floor
# => 94949493295293424
Math.sqrt(94949493295293427**2).floor
# => 94949493295293424

روبي تطفو مزدوج الدقة النقطة العائمة رقم ، الأمر الذي يعني أنها يمكن أن تمثل بدقة الأرقام مع (القاعدة) حوالي 16 هامة الأرقام العشرية.العادية واحدة-دقة أرقام النقطة العائمة انها كبيرة 7 أرقام.

يمكنك العثور على مزيد من المعلومات هنا:

ما كل عالم الكمبيوتر يجب أن تعرف عن حساب الفاصلة العائمة:http://docs.sun.com/source/819-3693/ncg_goldberg.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top