ما هو الحل المستحسن إذا numeric_limits <المزدوج> :: has_infinity هو زائف؟
سؤال
ولست بحاجة للتحقق قيمة مزدوجة لما لا نهاية في التطبيق C ++ على لينكس. على معظم المنصات وهذا يعمل عن طريق مقارنة مع std::numeric_limits<double>::infinity()
. ومع ذلك، على بعض الأنظمة الأساسية القديمة (ريدهات 9 على سبيل المثال، مع دول مجلس التعاون الخليجي 3.2.2) هذا غير متوفر، وstd::numeric_limits<double>::has_infinity
هو زائف هناك.
ما الحل تنصحين لتلك البرامج؟
المحلول 3
وطيب، ولقد لجأت الآن إلى استخدام INFINITY
وNAN
وحدات الماكرو على هذا الجهاز معينة - يبدو أن تعمل بشكل جيد. انهم يأتون من math.h
.
نصائح أخرى
إذا كنت تستخدم IEEE 754 الحساب، كما كنت شبه المؤكد، اللامتناهي وتعرف جيدا القيم وحددت النتائج لجميع العمليات الحسابية. على وجه الخصوص،
infinity - infinity = NaN
والإيجابية والسلبية ما لا نهاية وNaN
القيم هي القيم الوحيدة التي هذا هو الصحيح. NaNs لهي خاصة القيم "لا واحد في عدد" تستخدم للإشارة إلى أخطاء مجال الوظائف، على سبيل المثال sqrt(-1)
. أيضا:
NaN != NaN
وNaN
s هي القيم الوحيدة التي هذا هو الصحيح.
وذلك:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}
وسيعود صحيح إذا وفقط إذا x
إما لا نهاية إيجابية أو سلبية. إضافة اختبار لx > 0
إذا كنت تريد فقط للتحقق من ما لا نهاية إيجابية.
لمعظم الحالات، الأمراض المنقولة جنسيا :: :: numeric_limits ماكس () يمكن أن يكون بديلا صالحا لمدة الأمراض المنقولة جنسيا :: :: numeric_limits ما لا نهاية ().
وأنت يجب أن تكون أكثر حذرا حول استخدامه، ولكن. مع الفيضانات واعتقد انكم سوف يكون للكشف عن تجاوز يدويا وتعيين نتيجة إلى أقصى الحدود بشكل واضح إذا تم الكشف عن تجاوز.