سؤال

ما مدى تكلفة تحويل أ float إلى أ double؟هل هو تافه مثل int ل long تحويل؟

يحرر:أفترض أن النظام الأساسي حيث يكون التعويم 4 بايت والمزدوج 8 بايت

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

المحلول

اعتبارات المنصة

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

عند استخدام SSE (وأحيانًا يستخدم Visual Studio SSE بشكل افتراضي)، قد يكون الأمر مختلفًا، حيث قد تحتاج إلى نقل القيمة في سجلات FPU أو القيام بشيء واضح لإجراء التحويل.

أداء توفير الذاكرة

على سبيل التلخيص والرد على تعليقك في مكان آخر:إذا كنت تريد تخزين نتائج العمليات الحسابية العائمة في وحدة تخزين 32b، فستكون النتيجة بنفس السرعة أو أسرع، للأسباب التالية:

  • إذا قمت بذلك على نظام التشغيل x87، فسيكون التحويل مجانيًا - والفرق الوحيد هو أنه سيتم استخدام fstp dword[] بدلاً من fstp qword[].
  • إذا قمت بذلك مع تمكين SSE، فقد ترى بعض المكاسب في الأداء، حيث يمكن إجراء بعض الحسابات العائمة باستخدام SSE بمجرد أن تكون دقة الحساب عائمة فقط بدلاً من المضاعفة الافتراضية.
  • في جميع الحالات تكون حركة مرور الذاكرة أقل

نصائح أخرى

وتعويم إلى تحويلات مزدوجة يحدث مجانا على بعض الأنظمة الأساسية (PPC، إلى x86 إذا يستخدم بك مترجم / وقت التشغيل "إلى الجحيم مع نوع قلت لي للاستخدام، انا ذاهب الى تقييم كل شيء في لونغ المزدوج على أي حال، nyah nyah "وضع التقييم).

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

في بيئة المضمنة التي تفتقر إلى الأجهزة العائمة، فإنها يمكن أن تكون مكلفة بعض الشيء.

وهذا هو محدد لتنفيذ C ++ الذي تستخدمه. في C ++، الافتراضي نوع الفاصلة العائمة هو <م> المزدوج . مترجم ينبغي أن تصدر تحذيرا لالبرمجية التالية:

float a = 3.45;

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

float a = 3.45f;

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

وانظر أيضا القسم 4.5 من وC ++ لغة برمجة .

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

<اقتباس فقرة>   

وIEEE 754 دقة واحدة هي المشفرة   في 32 بت باستخدام 1 بت لعلامة، 8   بت لالأس، و 23 بت ل   وsignificand. ومع ذلك، فإنه يستخدم   الشيء الخفي، وبالتالي فإن significand هو 24   بت (ع = 24)، على الرغم من أنها   المشفرة باستخدام 23 بت فقط.

- ديفيد غولدبرغ، ما كل عالم الحاسوب يجب أن تعرفه عن الفاصلة العائمة الحساب

وهكذا، وتحويل بين تعويم وضعف يجري للحفاظ على نفس علامة الشيء، وتعيين 23/24 بت الأخيرة من العشري تعويم لالعشري الضعف، ووتعيين 8 بت الأخيرة من الأس تعويم لالأس ضعف و.

وربما حتى يمكن ضمان هذا السلوك حسب IEEE 754 ... أنا لم التحقق من ذلك، لذلك لست متأكدا.

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

وربما هذه المساعدة:

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

double _ftod(float fValue)
{
  char czDummy[30];
  printf(czDummy,"%9.5f",fValue);
  double dValue = strtod(czDummy,NULL);
  return dValue;
}


int main(int argc, char* argv[])
{
  float fValue(250.84f);
  double dValue = _ftod(fValue);//good conversion
  double dValue2 = fValue;//wrong conversion
  printf("%f\n",dValue);//250.840000
  printf("%f\n",dValue2);//250.839996
  getch();
  return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top