سؤال

أنا أستخدم أحدث GCC مع NetBeans على Windows. لماذا لا long double الشغل؟ هل printf المحدد %lf خاطئ - ظلم - يظلم؟

شفرة:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

انتاج:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...
هل كانت مفيدة؟

المحلول

بالإضافة إلى المعدل الخاطئ ، أي منفذ من مجلس التعاون الخليجي إلى Windows؟ تستخدم Mingw مكتبة Microsoft C ويبدو أنني أتذكر أن هذه المكتبة لا تملك أي دعم لـ 80Bits Double Double (يستخدم Microsoft C مترجم 64 بتات طوله 64 بت لأسباب مختلفة).

نصائح أخرى

من MinPage printf:

L (ELL) يتحول تحويل عدد صحيح التالي مع وسيطة طويلة أو غير موقعة طويلة ، أو تحويل N. يتوافق مع مؤشر إلى وسيطة wchar_t.

و

LA بعد تحويل A أو A أو E أو E أو F أو F أو G أو G يتوافق مع وسيطة مزدوجة طويلة. (C99 يسمح ٪ LF ، لكن SUSV2 لا.)

لذلك تريد %Le ، ليس %le

تحرير: يبدو أن بعض التحقيقات الإضافية تشير إلى أن MingW يستخدم وقت تشغيل MSVC/Win32 (لأشياء مثل printf) - والتي تتضاعف طويلًا إلى مضاعفة. لذا ، فإن خلط برنامج التحويل البرمجي (مثل GCC) يوفر مزدوجًا طويلًا مع وقت تشغيل لا يبدو أنه فوضى.

نعم لاجل long double, ، تحتاج إلى استخدام %Lf (أي ، الحالة العلوية 'l').

إذا كنت تستخدم MINGW ، فإن المشكلة هي أنه افتراضيًا ، يستخدم MINGW برنامج I/O RESP. وظائف التنسيق من وقت تشغيل Microsoft C ، والذي لا يدعم 80 بت أرقام عائمة (long double == double في Microsoft Land).

ومع ذلك ، يأتي Mingw أيضًا مع مجموعة من التطبيقات البديلة فعل دعم بشكل صحيح الزوجي الطويل. لاستخدامها ، بادئة أسماء الوظائف مع __mingw_ (على سبيل المثال __mingw_printf). اعتمادًا على طبيعة مشروعك ، قد ترغب أيضًا في ذلك على مستوى العالم #define printf __mingw_printf او استعمل -D__USE_MINGW_ANSI_STDIO (الذي يمكّن إصدارات MingW لجميع printfوظائف العائلة).

هل كان لديّ قضية اختبار الزوجي الطويل ، والأسف ، صادفت إصلاحًا! يجب عليك تجميع مشروعك باستخدام -d__use_mingw_ansi_stdio:

Jason Huntley@centurian /home/developer/dependencies/python-2.7.3/test $ gcc main.c

Jason Huntley@centurian /home/developer/dependencies/python-2.7.3/test $ a.exe c = 0.000000

Jason Huntley@centurian /home/developer/dependencies/python-2.7.3/test $ gcc main.c -d__use_mingw_ansi_stdio

Jason Huntley@centurian /home/developer/dependencies/python-2.7.3/test $ a.exe c = 42.000000

شفرة:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}

في C99 المعدل الطول ل long double يبدو أن L و لا l. man fprintf (أو ما يعادل Windows) يجب أن يخبرك بمنصة معينة.

كما قيل في إجابات أخرى ، فإن محدد التحويل الصحيح هو "%Lf".

قد ترغب في تشغيل تحذير التنسيق باستخدام -Wformat (أو -Wall, ، الذي يتضمن -Wformat) في الاحتجاج في مجلس التعاون الخليجي

$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$

تستخدم وظيفة PrintF و ScanF في C/C ++ مكتبة Microsoft C ولا تحتوي هذه المكتبة على دعم لمدة 10 بايت طولها. لذلك عندما تستخدم وظيفة printf و scanf في رمز c/c ++ الخاص بك لطباعة مزدوجة طويلة كمخرجات ولأخذ بعض المدخلات كضربة طويلة ، ستمنحك دائمًا نتيجة خاطئة.

إذا كنت ترغب في استخدام وظيفة مزدوجة طويلة ، فيجب عليك استخدام وظيفة "__mingw_printf" و "__mingw_scanf" بدلاً من printf و scanf. لديها دعم لمدة 10 بايت طويلة مزدوجة.

أو يمكنك تحديد اثنين من الماكرو مثل هذا: "#define printf __mingw_printf" و "#define scanf __mingw_scanf"

استخدم التنسيق القياسي لفترة طويلة: ٪ LF

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