#FEATURE by cg
authorClaus Gittinger <cg@exept.de>
Tue, 25 Jul 2017 17:09:56 +0200
changeset 22100 c9b9cf3e0527
parent 22099 cc9d508cf69c
child 22101 bf59a1a919c7
#FEATURE by cg class: LongFloat added: #isInfinite
LongFloat.st
--- a/LongFloat.st	Tue Jul 25 16:36:59 2017 +0200
+++ b/LongFloat.st	Tue Jul 25 17:09:56 2017 +0200
@@ -2066,6 +2066,50 @@
     "
 !
 
+isInfinite
+    "return true, if the receiver is an infinite float (Inf).
+     These are not created by ST/X float operations (they raise an exception);
+     however, inline C-code could produce them ...
+     Redefined here for speed"
+
+%{  /* NOCONTEXT */
+
+#ifdef LONG_infinite
+    LONGFLOAT lV = __longFloatVal(self);
+
+    if (LONG_infinite(lV)) { RETURN (true); }
+    RETURN (false);
+#else
+# if defined(LONG_finite) && defined(LONG_isnan)
+    LONGFLOAT lV = __longFloatVal(self);
+
+    if (!LONG_finite(lV) && !LONG_isnan(lV) ) { RETURN (true); }
+    RETURN (false);
+# endif
+#endif
+%}.
+    ^ self isFinite not and:[self isNaN not]
+
+    "
+        1.0 asLongFloat isFinite -> true
+        1.0 asLongFloat isInfinite -> false
+        
+        (0.0 asLongFloat uncheckedDivide: 0.0) isFinite -> false
+        (0.0 asLongFloat uncheckedDivide: 0.0) isInfinite -> false
+        (0.0 asLongFloat uncheckedDivide: 0.0) isNaN -> true
+
+        (1.0 asLongFloat uncheckedDivide: 0.0) isFinite -> false
+        (1.0 asLongFloat uncheckedDivide: 0.0) isInfinite -> true
+        (1.0 asLongFloat uncheckedDivide: 0.0) isNaN -> false
+
+        (-1.0 asLongFloat uncheckedDivide: 0.0) isFinite -> false
+        (-1.0 asLongFloat uncheckedDivide: 0.0) isInfinite -> true
+        (-1.0 asLongFloat uncheckedDivide: 0.0) isNaN -> false
+    "
+
+    "Created: / 25-07-2017 / 17:04:04 / cg"
+!
+
 isNaN
     "return true, if the receiver is an invalid float (NaN - not a number).
      These are not created by ST/X float operations (they raise an exception);