printf و long double
-
28-09-2019 - |
سؤال
أنا أستخدم أحدث 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