سؤال

ما هي مزايا وعيوب استخدام أحدهما بدلاً من الآخر في C++؟

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

المحلول

إذا أردت أن تعرف الإجابة الصحيحة عليك بالقراءة ما يجب أن يعرفه كل عالم كمبيوتر عن حساب النقطة العائمة.

باختصار، على الرغم من double مسموح ل دقة أعلى في تمثيله، لبعض الحسابات التي من شأنها أن تنتج أخطاء أكبر.الاختيار "الصحيح" هو: استخدم القدر الذي تحتاجه من الدقة ولكن ليس أكثر و اختر الخوارزمية الصحيحة.

يقوم العديد من المترجمين بإجراء رياضيات الفاصلة العائمة الموسعة في الوضع "غير الصارم" على أي حال (على سبيل المثال.استخدام نوع النقطة العائمة الأوسع المتوفر في الأجهزة، على سبيل المثال.80 بت و128 بت عائمة)، ويجب أن يؤخذ ذلك في الاعتبار أيضًا.في الممارسة العملية، يمكنك بالكاد نرى أي فرق في السرعة - هم مواطنون في الأجهزة على أي حال.

نصائح أخرى

واذا لم يكن سبب محدد لعدم القيام بذلك، استخدم مزدوجة.

ولعل من المستغرب، فمن مزدوج ولا تطفو وهذا هو "طبيعي" نوع الفاصلة العائمة في C (وC ++). وظائف الرياضيات القياسية مثل <قوية> الخطيئة و <قوية> تسجيل التقاط الزوجي كوسائط، والعودة الزوجي. A العادية الفاصلة العائمة حرفية، كما هو الحال عندما تكتب على 3.14 في البرنامج، لديه نوع مزدوج. لا تطفو.

في أجهزة الكمبيوتر الحديثة النموذجية، يمكن أن يكون مجرد الزوجي بأسرع ما يطفو، أو حتى أسرع، لذلك الأداء هو عادة ليست عاملا للنظر، حتى بالنسبة للحسابات الكبيرة. (وهل تلك يجب أن تكون <م> كبيرة الحسابات، أو الأداء لا ينبغي حتى تدخل عقلك. بلدي جديد الكمبيوتر i7 من سطح المكتب يمكن القيام به ستة مليارات الضرب الزوجي في ثانية واحدة).

من المستحيل الإجابة على هذا السؤال لأنه لا يوجد سياق للسؤال.فيما يلي بعض الأشياء التي يمكن أن تؤثر على الاختيار:

  1. تنفيذ المترجم للعوامات والمضاعفات والمضاعفات الطويلة.ينص معيار C++ على ما يلي:

    هناك ثلاثة أنواع من النقاط العائمة:تعويم، مزدوج، ومزدوج طويل.يوفر النوع المزدوج دقة على الأقل مثل التعويم، ويوفر النوع الطويل المزدوج نفس القدر من الدقة على الأقل مثل المزدوج.

    لذا، يمكن أن يكون الثلاثة جميعًا بنفس الحجم في الذاكرة.

  2. وجود FPU.لا تحتوي جميع وحدات المعالجة المركزية (CPUs) على وحدات FPU وأحيانًا تتم محاكاة أنواع الفاصلة العائمة وأحيانًا لا تكون أنواع الفاصلة العائمة مدعومة.

  3. الهندسة المعمارية FPU.وحدة FPU الخاصة بـ IA32 هي 80 بت داخليًا - يتم توسيع العوامات 32 بت و64 بت إلى 80 بت عند التحميل وتقليلها في المتجر.هناك أيضًا SIMD الذي يمكنه عمل أربع عوامات 32 بت أو عائمتين 64 بت بالتوازي.لم يتم تعريف استخدام SIMD في المعيار لذلك سيتطلب مترجمًا يقوم بتحليل أكثر تعقيدًا لتحديد ما إذا كان يمكن استخدام SIMD، أو يتطلب استخدام وظائف خاصة (المكتبات أو العناصر الجوهرية).تتمثل نتيجة التنسيق الداخلي 80 بت في أنه يمكنك الحصول على نتائج مختلفة قليلاً اعتمادًا على عدد مرات حفظ البيانات في ذاكرة الوصول العشوائي (وبالتالي فقدان الدقة).لهذا السبب، لا يقوم المترجمون بتحسين كود النقطة العائمة بشكل جيد.

  4. عرض النطاق الترددي للذاكرة.إذا كانت البيانات المزدوجة تتطلب مساحة تخزين أكبر من البيانات العائمة، فستستغرق قراءة البيانات وقتًا أطول.هذا هو الجواب الساذج.في IA32 الحديث، كل هذا يتوقف على مصدر البيانات.إذا كان في ذاكرة التخزين المؤقت L1، يكون التحميل ضئيلًا بشرط أن تأتي البيانات من سطر ذاكرة تخزين مؤقت واحد.إذا كان يمتد على أكثر من سطر ذاكرة تخزين مؤقت، فسيكون هناك حمل بسيط.إذا كان من L2، فسيستغرق وقتًا أطول، وإذا كان في ذاكرة الوصول العشوائي (RAM)، فسيظل أطول وأخيرًا، إذا كان على القرص، فهذا وقت كبير.لذا فإن اختيار التعويم أو المزدوج أقل أهمية من طريقة استخدام البيانات.إذا كنت تريد إجراء عملية حسابية صغيرة على الكثير من البيانات المتسلسلة، فمن الأفضل استخدام نوع بيانات صغير.إن إجراء الكثير من العمليات الحسابية على مجموعة بيانات صغيرة سيسمح لك باستخدام أنواع بيانات أكبر مع أي تأثير كبير.إذا كنت تصل إلى البيانات بشكل عشوائي جدًا، فإن اختيار حجم البيانات ليس مهمًا - حيث يتم تحميل البيانات في الصفحات/أسطر ذاكرة التخزين المؤقت.لذا، حتى إذا كنت تريد فقط بايتًا من ذاكرة الوصول العشوائي (RAM)، فيمكنك نقل 32 بايتًا (وهذا يعتمد بشكل كبير على بنية النظام).علاوة على كل هذا، يمكن أن تكون وحدة المعالجة المركزية/وحدة FPU ذات عددية فائقة (تُعرف أيضًا باسم الأنابيب).لذلك، على الرغم من أن التحميل قد يستغرق عدة دورات، إلا أن وحدة المعالجة المركزية/وحدة FPU قد تكون مشغولة بفعل شيء آخر (الضرب على سبيل المثال) يخفي وقت التحميل إلى حد ما.

  5. لا يفرض المعيار أي تنسيق معين لقيم الفاصلة العائمة.

إذا كان لديك مواصفات، فسوف يرشدك إلى الاختيار الأمثل.خلاف ذلك، يعود الأمر إلى الخبرة فيما يتعلق بما يجب استخدامه.

ومزدوجة هي أكثر دقة ولكن يتم ترميز في 8 بايت. تعويم هو 4 بايت فقط، لذلك مساحة أقل وأقل دقة.

ويجب أن تكون حذرا جدا إذا كان لديك ضعف وتطفو في التطبيق الخاص بك. كان لدي خلل بسبب ذلك في الماضي. وكان جزء واحد من التعليمات البرمجية باستخدام تطفو في حين أن بقية رمز كان يستخدم مزدوجة. يمكن نسخ مزدوجة لتطفو ثم تطفو إلى مضاعفة تسبب خطأ الدقة التي يمكن أن يكون لها تأثير كبير. في حالتي، كان مصنع للكيماويات ... نأمل أن لا تكون له عواقب مأساوية:)

وأعتقد أنه بسبب هذا النوع من الخلل الذي الصاروخ أريان 6 قد انفجرت قبل بضع سنوات!

وفكر مليا في نوع لاستخدامها لمتغير

وأنا شخصيا الذهاب لضعف في كل وقت حتى أرى بعض الاختناقات. بعد ذلك يفكر في الانتقال إلى تعويم أو تحسين بعض المناطق الأخرى

وهذا يعتمد على الطريقة التي تنفذ بها مترجم مزدوج. انها قانونية لمضاعفة وتطفو أن تكون من نفس النوع (وكان على بعض الأنظمة).

وأن يقال، إذا كانت مختلفة في الواقع، فإن القضية الرئيسية هي الدقة. وضعف لديه دقة أعلى من ذلك بكثير نظرا لانها الفرق في الحجم. إذا كانت الأرقام التي تستخدم عادة ستتجاوز قيمة تعويم، ثم استخدام مزدوج.

وقد ذكر

وعدة أشخاص آخرين isssues الأداء. ومن شأن ذلك أن يكون الماضي بالضبط على قائمتي من الاعتبارات. يجب أن تكون دقة نظركم # 1.

استخدم أي دقة مطلوبة لتحقيق النتائج المناسبة.إذا وجدت بعد ذلك أن الكود الخاص بك لا يعمل بالشكل الذي تريده (هل استخدمت التوصيف بشكل صحيح؟) فألق نظرة على:

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

والفرق الرئيسي بين تعويم وضعف هو الدقة. ويكيبيديا لديها مزيد من المعلومات حول الدقة واحدة (تعويم) و <لأ href = "HTTP: //en.wikipedia كافيه / ويكي / مزدوجة الدقة "يختلط =" نوفولو noreferrer "> مزدوجة الدقة .

وهذا يعتمد إلى حد كبير على وحدة المعالجة المركزية المقايضات الأكثر وضوحا ما بين الدقة والذاكرة. مع باريه من ذاكرة الوصول العشوائي، والذاكرة ليست بكثير من قضية، لذلك فمن الأفضل عموما لاستخدام doubles.

وأما بالنسبة للأداء، فإنه يعتمد بشكل كبير على وحدة المعالجة المركزية. سوف floats عادة الحصول على أداء أفضل من doubles على جهاز 32 بت. على 64 بت، doubles تكون في بعض الأحيان بشكل أسرع، لأنه هو (عادة) حجم الأصلي. ومع ذلك، ما الذي يهم أكثر بكثير من اختيارك من أنواع البيانات أم لا يمكنك الاستفادة من تعليمات SIMD على المعالج الخاص بك.

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

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