سؤال

limits.h يحدد حدود أنواع الرياضيات غير العائمة ، على سبيل المثال INT_MIN و INT_MAX. هذه القيم هي القيم الأكثر سلبية والأكثر إيجابية التي يمكنك تمثيلها باستخدام int.

في float.h, ، هناك تعريفات ل FLT_MIN و FLT_MAX. إذا قمت بما يلي:

NSLog(@"%f %f", FLT_MIN, FLT_MAX);

تحصل على الإخراج التالي:

FLT_MIN = 0.000000, FLT_MAX = 340282346638528859811704183484516925440.000000

FLT_MAX يساوي عددًا كبيرًا حقًا ، كما تتوقع ، ولكن لماذا FLT_MIN يساوي الصفر بدلاً من رقم سالب كبير حقًا؟

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

المحلول

إنه ليس صفرًا بالفعل ، لكنه قد يبدو صفرًا إذا قمت بفحصه باستخدامه printf أو NSLog باستخدام %f.
بالنسبة الى float.h (على الأقل في Mac OS X 10.6.2) ، FLT_MIN يوصف باسم:

/* Minimum normalized positive floating-point number, b**(emin - 1).  */

لاحظ ال إيجابي في تلك الجملة: FLT_MIN يشير إلى الحد الأدنى (الطبيعي) أكبر من الصفر. (هناك أرقام أصغر غير طبيعية).

إذا كنت تريد الحد الأدنى لرقم النقطة العائمة (بما في ذلك الأرقام السلبية) ، فاستخدم -FLT_MAX.

نصائح أخرى

يطبع التنسيق '٪ f' 6 أماكن عشرية بتنسيق ثابت. نظرًا لأن FLT_MIN أصغر كثيرًا ، يبدو أنه صفر في نقطة ثابتة. إذا كنت تستخدم تنسيق "٪ E" أو "٪ G" ، فستحصل على إجابة أفضل منسقة. وبالمثل مع FLT_MAX.

#include <float.h>
#include <stdio.h>
int main(void)
{
    printf("MIN = %f, MAX = %f\n", FLT_MIN, FLT_MAX);
    printf("MIN = %e, MAX = %e\n", FLT_MIN, FLT_MAX);
    return(0);
}


MIN = 0.000000, MAX = 340282346638528859811704183484516925440.000000
MIN = 1.175494e-38, MAX = 3.402823e+38

كلما ستحاول طباعة قيمة FLT_MIN من ملف الرأس القياسي float.h ، ستحصل على 0.000000 (كما ترى في شاشة الإخراج الخاصة بك). هذا ليس خطأ في الواقع. أنت تحصل على هذه النتيجة لأن التنسيق المحدد ٪ f. بشكل عام ٪ f print 6 أرقام بعد النقطة العشرية ولكن في هذه الحالة تكون القيمة السالبة الموقعة صغيرة لدرجة أنك تحتاج إلى طباعة كمية كبيرة من الأرقام بعد النقطة العشرية.

لقد استخدمت ٪ .54F (تعتمد على الجهاز) للحصول على النتيجة المرغوبة (0.000000000000000000000000000000000000011754943508222875 لنظامتي).

// تحقق من هذا على نظامك

#include<stdio.h>
#include<float.h>
int main()
{
    printf("Minimum signed float %.55f\n",FLT_MIN);
    printf("Minimum signed float %e\n",FLT_MIN);
    return 0;
}

//انتاج :-

.

// الحد الأدنى الموقّع عن تعويم 1.175494e-038

أعتقد الآن أنه من الواضح لك سبب حصولك على 0.000000 لـ Char_min وكيفية الحصول على النتيجة الصحيحة مع نفس التنسيق. على الرغم من أنه يمكنك استخدام ٪ E لتحسين نتيجة تنسيق.

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