initial checkin
authorClaus Gittinger <cg@exept.de>
Sat, 21 Jun 2003 12:02:34 +0200
changeset 204 7a02eaf7f06b
parent 203 10c8e5197b62
child 205 6febc6a9d02b
initial checkin
RegressionTests__LargeFloatTest.st
RegressionTests__MetaNumbersTest.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RegressionTests__LargeFloatTest.st	Sat Jun 21 12:02:34 2003 +0200
@@ -0,0 +1,426 @@
+"{ Package: 'exept:regression' }"
+
+"{ NameSpace: RegressionTests }"
+
+TestCase subclass:#LargeFloatTest
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'tests-Regression'
+!
+
+
+!LargeFloatTest methodsFor:'helpers'!
+
+actualPrecisionOf:aFloatClass
+    "get the actual number of valid bits in the mantissa.
+     This does a real test (i.e. does not believe the compiled-in ifdefs)"
+
+    |one half x count|
+
+    one := aFloatClass unity.  "/ 1.0 in this class
+    half := one coerce:0.5.
+    x := one.    
+    count := 0.
+
+    [ one + x ~= one] whileTrue:[
+        x := x * half.
+        count := count + 1.
+    ].
+    ^ count
+
+    "
+     self basicNew actualPrecisionOf:ShortFloat 
+     self basicNew actualPrecisionOf:Float      
+     self basicNew actualPrecisionOf:LongFloat   
+    "
+! !
+
+!LargeFloatTest methodsFor:'tests'!
+
+test01_Nan
+    "NaN in all avaliable formats."
+
+    |shouldBeNaN|
+
+    shouldBeNaN := 0.0 asLargeFloat uncheckedDivide: 0.0.
+    self assert:( shouldBeNaN isMemberOf:LargeFloat ).
+    self assert:( shouldBeNaN isNaN ).
+    self assert:( shouldBeNaN isFinite not ).
+
+
+    shouldBeNaN := 0.0 asLargeFloat uncheckedDivide: 0.0.
+    self assert:( shouldBeNaN asShortFloat isNaN ).
+    self assert:( shouldBeNaN asLongFloat isNaN ).
+    self should:[ shouldBeNaN asInteger ] raise:DomainError.
+
+
+    self assert:( shouldBeNaN + 1 ) isNaN.
+    self assert:( shouldBeNaN + 1.0 ) isNaN.
+    self assert:( shouldBeNaN + 1.0 asShortFloat ) isNaN.
+    self assert:( shouldBeNaN + 1.0 asLongFloat ) isNaN.
+    self assert:( shouldBeNaN + 1.0 asLargeFloat ) isNaN.
+
+    self assert:( 1 + shouldBeNaN ) isNaN.
+    self assert:( 1.0 + shouldBeNaN ) isNaN.
+    self assert:( 1.0 asShortFloat + shouldBeNaN ) isNaN.
+    self assert:( 1.0 asLongFloat + shouldBeNaN ) isNaN.
+    self assert:( 1.0 asLargeFloat + shouldBeNaN ) isNaN.
+
+    self assert:( shouldBeNaN - 1 ) isNaN.
+    self assert:( shouldBeNaN - 1.0 ) isNaN.
+    self assert:( shouldBeNaN - 1.0 asShortFloat ) isNaN.
+    self assert:( shouldBeNaN - 1.0 asLongFloat ) isNaN.
+    self assert:( shouldBeNaN - 1.0 asLargeFloat ) isNaN.
+
+    self assert:( 1 - shouldBeNaN ) isNaN.
+    self assert:( 1.0 - shouldBeNaN ) isNaN.
+    self assert:( 1.0 asShortFloat - shouldBeNaN ) isNaN.
+    self assert:( 1.0 asLongFloat - shouldBeNaN ) isNaN.
+    self assert:( 1.0 asLargeFloat - shouldBeNaN ) isNaN.
+
+    "
+     self basicNew test01_Nan
+    "
+!
+
+test02_Inf
+    "Infinity in all avaliable formats."
+
+    |check posInf negInf|
+
+    check := 
+        [:v1 :v2 |
+
+            posInf := v1 uncheckedDivide: v2.
+
+            self assert:( posInf isMemberOf:v1 class ).
+            self assert:( posInf isNaN not ).
+            self assert:( posInf isFinite not ).
+            self assert:( posInf isInfinite ).
+            self assert:( posInf positive ).
+            self assert:( posInf negative not ).
+            self assert:( posInf isNegativeInfinity not).
+            self assert:( posInf isPositiveInfinity ).
+
+            negInf := v1 negated uncheckedDivide: v2.
+
+            self assert:( negInf isMemberOf:v1 class ).
+            self assert:( negInf isNaN not ).
+            self assert:( negInf isFinite not ).
+            self assert:( negInf isInfinite ).
+            self assert:( negInf positive not).
+            self assert:( negInf negative ).
+            self assert:( negInf isNegativeInfinity ).
+            self assert:( negInf isPositiveInfinity not ).
+
+            self assert:( negInf + negInf = negInf).
+            self assert:( posInf + posInf = posInf).
+            self assert:( negInf + posInf) isNaN.
+            self assert:( posInf + negInf) isNaN.
+
+            self assert:( negInf - posInf = negInf).
+            self assert:( negInf - negInf) isNaN.
+            self assert:( posInf - negInf = posInf).
+            self assert:( posInf - posInf) isNaN.
+
+            self assert:( posInf + v1) = posInf.
+            self assert:( posInf - v1) = posInf.
+            self assert:( negInf + v1) = negInf.
+            self assert:( negInf - v1) = negInf.
+        ].
+
+    check value: 1.0 asLargeFloat value: 0.0 asLargeFloat.
+
+    "
+     self basicNew test02_Inf
+    "
+!
+
+test03_Conversion
+    self assert:( 1.0 asLargeFloat asTrueFraction == 1 ).
+    self assert:( 2.0 asLargeFloat asTrueFraction == 2 ).
+    self assert:( 4.0 asLargeFloat asTrueFraction == 4 ).
+    self assert:( 8.0 asLargeFloat asTrueFraction == 8 ).
+    self assert:( 16.0 asLargeFloat asTrueFraction == 16 ).
+    self assert:( 1048576.0 asLargeFloat asTrueFraction == 1048576 ).
+    self assert:( 0.5 asLargeFloat asTrueFraction = (1/2) ).
+    self assert:( 0.25 asLargeFloat asTrueFraction = (1/4) ).
+    self assert:( 0.125 asLargeFloat asTrueFraction = (1/8) ).
+
+    "
+     self basicNew test03_Conversion
+    "
+!
+
+test04_Arithmetic
+    self assert:( 1.0 asLargeFloat + 1.0 ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat + 1.0 asShortFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat + 1.0 asFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat + 1 ) class == LargeFloat.
+
+    self assert:( 1.0 asLargeFloat - 1.0 ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat - 1.0 asShortFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat - 1.0 asFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat - 1 ) class == LargeFloat.
+
+    self assert:( 1.0 asLargeFloat * 1.0 ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat * 1.0 asShortFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat * 1.0 asFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat * 1 ) class == LargeFloat.
+
+    self assert:( 1.0 asLargeFloat / 1.0 ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat / 1.0 asShortFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat / 1.0 asFloat ) class == LargeFloat.
+    self assert:( 1.0 asLargeFloat / 1 ) class == LargeFloat.
+
+    self assert:( 1.0 asLargeFloat + 1.0 asLargeFloat) = 2.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + 0.0 asLargeFloat) = 1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + 2.0 asLargeFloat) = 3.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + 3.0 asLargeFloat) = 4.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + 1.0 asLargeFloat negated) = 0.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + 2.0 asLargeFloat negated) = -1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat + -1.0 asLargeFloat negated) = 2.0 asLargeFloat.
+
+    self assert:( 1.0 asLargeFloat - 1.0 asLargeFloat) = 0.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - 0.0 asLargeFloat) = 1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - 2.0 asLargeFloat) = -1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - 3.0 asLargeFloat) = -2.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - 1.0 asLargeFloat negated) = 2.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - 2.0 asLargeFloat negated) = 3.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat - -1.0 asLargeFloat negated) = 0.0 asLargeFloat.
+
+    self assert:( 1.0 asLargeFloat * 1.0 asLargeFloat) = 1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * 0.0 asLargeFloat) = 0.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * 2.0 asLargeFloat) = 2.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * 3.0 asLargeFloat) = 3.0 asLargeFloat.
+    self assert:( 2.0 asLargeFloat * 3.0 asLargeFloat) = 6.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * 1.0 asLargeFloat negated) = -1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * 2.0 asLargeFloat negated) = -2.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat * -1.0 asLargeFloat negated) = 1.0 asLargeFloat.
+
+    self assert:( 1.0 asLargeFloat / 1.0 asLargeFloat) = 1.0 asLargeFloat.
+    self assert:( 1.0 asLargeFloat / 2.0 asLargeFloat) = 0.5 asLargeFloat.
+    self assert:( 3.0 asLargeFloat / 2.0 asLargeFloat) = (3/2) asLargeFloat.
+
+    "
+     self basicNew test04_Arithmetic
+    "
+!
+
+test05_Comparing
+    self assert:( 2.0 asLargeFloat = 2 ).
+    self assert:( 2.0 asLargeFloat = 2.0 asShortFloat ).
+    self assert:( 2.0 asLargeFloat = 2.0 ).
+    self assert:( 2.0 asLargeFloat = 2.0 asLongFloat ).
+    self assert:( 2.0 asLargeFloat = 2.0 asLargeFloat ).
+
+    self assert:( 2.0 asLargeFloat = 3 ) not.
+    self assert:( 2.0 asLargeFloat = 3.0 asShortFloat ) not.
+    self assert:( 2.0 asLargeFloat = 3.0 ) not.
+    self assert:( 2.0 asLargeFloat = 3.0 asLongFloat ) not.
+    self assert:( 2.0 asLargeFloat = 3.0 asLargeFloat ) not.
+
+    self assert:( 2.0 asLargeFloat < 3 ).
+    self assert:( 2.0 asLargeFloat < 3.0 asShortFloat ).
+    self assert:( 2.0 asLargeFloat < 3.0 asLargeFloat ).
+
+    self assert:( 200000000000000000000.0 asLargeFloat < 200000000000100000000 ).
+
+    self assert:( 200000000000000000000 < 200001000000000000000.0 asLargeFloat ).
+
+
+    self assert:( 2.0 asLargeFloat <= 3 ).
+    self assert:( 2.0 asLargeFloat <= 2 ).
+    self assert:( 2.0 asLargeFloat <= 3.0 asShortFloat ).
+    self assert:( 2.0 asLargeFloat <= 2.0 asShortFloat ).
+    self assert:( 2.0 asLargeFloat <= 3.0 asLongFloat ).
+    self assert:( 2.0 asLargeFloat <= 2.0 asLongFloat ).
+    self assert:( 2.0 asLargeFloat <= 3.0 asLargeFloat ).
+    self assert:( 2.0 asLargeFloat <= 2.0 asLargeFloat ).
+
+    self assert:( 200000000000000000000.0 asLargeFloat <= 200000000000000000001 ).
+    self assert:( 200000000000000000000.0 asLargeFloat <= 200000000000000000000 ).
+
+    self assert:( 200000000000000000000 <= 200001000000000000000.0 asLargeFloat ).
+    self assert:( 200000000000000000000 <= 200000000000000000000.0 asLargeFloat ).
+
+    "
+     self basicNew test05_Comparing
+    "
+!
+
+test06_MiscMath
+    #(
+"/        sqrt       0.5
+"/        exp        0.5
+"/        ln         0.5
+"/        log10      0.5
+"/        sin        0.5
+"/        cos        0.5
+"/        tan        0.5
+"/        arcSin     0.5
+"/        arcCos     0.5
+"/        arcTan     0.5
+
+        sinh       0.5 
+        cosh       0.5
+        tanh       0.5
+        arcSinh    0.5
+        arcCosh    1.5
+        arcTanh    0.5
+    ) pairWiseDo:[:op :arg |
+"/        self assert:( arg asLargeFloat perform:op ) class == LargeFloat.
+        ( arg asLargeFloat perform:op ) class == LargeFloat ifFalse:[
+            Transcript showCR:'warning: missing LargeFloat function: ' , op.
+        ].
+
+        self assert:( (arg perform:op) - (arg asLargeFloat perform:op) ) < 0.000001.
+        self assert:( (arg perform:op) - (arg perform:op) asLargeFloat ) < 0.000001.
+    ].
+
+    "
+     self basicNew test06_MiscMath
+    "
+!
+
+test07_Truncation
+    |check|
+
+    check := [:num |
+        self assert:( num fractionPart + num truncated ) = num.
+        self assert:( num fractionPart + num truncated ) class == num class.
+    ].
+
+    check value:1.6 asLargeFloat.
+    check value:-1.6 asLargeFloat.
+
+
+    self assert:( 1.6 asLargeFloat ceiling ) = 2.
+
+    self assert:( 1.6 asLargeFloat ceilingAsFloat ) = 2.0 asLargeFloat.
+    self assert:( 1.6 asLargeFloat ceilingAsFloat ) class == LargeFloat.
+
+
+    self assert:( 1.6 asLargeFloat floor ) = 1.
+
+    self assert:( 1.6 asLargeFloat floorAsFloat ) = 1.0 asLargeFloat.
+    self assert:( 1.6 asLargeFloat floorAsFloat ) class == LargeFloat.
+
+
+    self assert:( 0.4 asLargeFloat rounded ) class == SmallInteger.    
+    self assert:( 0.4 asLargeFloat rounded = 0 ).    
+    self assert:( 0.5 asLargeFloat rounded = 1 ).     
+    self assert:( 0.6 asLargeFloat rounded = 1 ).     
+    self assert:( -0.4 asLargeFloat rounded = 0 ).    
+    self assert:( -0.5 asLargeFloat rounded = -1 ).    
+    self assert:( -0.6 asLargeFloat rounded = -1 ).    
+
+    self assert:( 0.4 asLargeFloat roundedAsFloat ) class == LargeFloat.    
+    self assert:( 0.4 asLargeFloat roundedAsFloat  = 0.0 ).    
+    self assert:( 0.5 asLargeFloat roundedAsFloat  = 1.0 ).    
+    self assert:( 0.6 asLargeFloat roundedAsFloat  = 1.0 ).    
+    self assert:( -0.4 asLargeFloat roundedAsFloat = 0 ).    
+    self assert:( -0.5 asLargeFloat roundedAsFloat = -1.0 ).    
+    self assert:( -0.6 asLargeFloat roundedAsFloat = -1.0 ).    
+
+    self assert:( 0.4 truncated ) class == SmallInteger.    
+    self assert:( 0.4 truncated = 0 ).    
+    self assert:( 0.5 truncated = 0 ).     
+    self assert:( 0.6 truncated = 0 ).     
+    self assert:( -0.4 truncated = 0 ).    
+    self assert:( -0.5 truncated = 0 ).    
+    self assert:( -0.6 truncated = 0 ).    
+
+    self assert:( 0.4 truncatedAsFloat ) class == Float.    
+    self assert:( 0.4 truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.5 truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.6 truncatedAsFloat  = 0.0 ).    
+    self assert:( -0.4 truncatedAsFloat = 0 ).    
+    self assert:( -0.5 truncatedAsFloat = 0.0 ).    
+    self assert:( -0.6 truncatedAsFloat = 0.0 ).    
+
+    self assert:( 0.4 asShortFloat truncated ) class == SmallInteger.    
+    self assert:( 0.4 asShortFloat truncated = 0 ).    
+    self assert:( 0.5 asShortFloat truncated = 0 ).     
+    self assert:( 0.6 asShortFloat truncated = 0 ).     
+    self assert:( -0.4 asShortFloat truncated = 0 ).    
+    self assert:( -0.5 asShortFloat truncated = 0 ).    
+    self assert:( -0.6 asShortFloat truncated = 0 ).    
+
+    self assert:( 0.4 asShortFloat truncatedAsFloat ) class == ShortFloat.    
+    self assert:( 0.4 asShortFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.5 asShortFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.6 asShortFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( -0.4 asShortFloat truncatedAsFloat = 0 ).    
+    self assert:( -0.5 asShortFloat truncatedAsFloat = 0.0 ).    
+    self assert:( -0.6 asShortFloat truncatedAsFloat = 0.0 ).    
+
+    self assert:( 0.4 asLargeFloat truncated ) class == SmallInteger.    
+    self assert:( 0.4 asLargeFloat truncated = 0 ).    
+    self assert:( 0.5 asLargeFloat truncated = 0 ).     
+    self assert:( 0.6 asLargeFloat truncated = 0 ).     
+    self assert:( -0.4 asLargeFloat truncated = 0 ).    
+    self assert:( -0.5 asLargeFloat truncated = 0 ).    
+    self assert:( -0.6 asLargeFloat truncated = 0 ).    
+
+    self assert:( 0.4 asLargeFloat truncatedAsFloat ) class == LargeFloat.    
+    self assert:( 0.4 asLargeFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.5 asLargeFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( 0.6 asLargeFloat truncatedAsFloat  = 0.0 ).    
+    self assert:( -0.4 asLargeFloat truncatedAsFloat = 0 ).    
+    self assert:( -0.5 asLargeFloat truncatedAsFloat = 0.0 ).    
+    self assert:( -0.6 asLargeFloat truncatedAsFloat = 0.0 ).    
+
+    "
+     self basicNew test07_Truncation
+    "
+!
+
+test08_Representation
+"/    self assert:( 0.0 asLargeFloat exponent = 0 ).      
+"/    self assert:( 1.0 asLargeFloat exponent = 0 "1" ).
+"/    self assert:( 2.0 asLargeFloat exponent = 1 "2" ).
+"/    self assert:( 3.0 asLargeFloat exponent = 2 ).
+"/    self assert:( 4.0 asLargeFloat exponent = 3 ).
+"/    self assert:( 0.5 asLargeFloat exponent = 0 ).
+"/    self assert:( 0.4 asLargeFloat exponent = -1 ).
+"/    self assert:( 0.25 asLargeFloat exponent = -1 ).
+"/    self assert:( 0.125 asLargeFloat exponent = -2 ).
+"/    self assert:( 0.00000011111 asLargeFloat exponent = -23 ).
+
+    "
+     self basicNew test08_Representation
+    "
+!
+
+test09_Testing
+    self assert:( 0.0 asLargeFloat isZero ).      
+    self assert:( 1.0 asLargeFloat isZero not ).      
+
+    self assert:( 0.0 asLargeFloat negative not ).      
+    self assert:( 1.0 asLargeFloat negative not ).      
+    self assert:( -1.0 asLargeFloat negative ).      
+
+    self assert:( 0.0 asLargeFloat positive ).      
+    self assert:( 1.0 asLargeFloat positive ).      
+    self assert:( -1.0 asLargeFloat positive not ).      
+
+    self assert:( 0.0 asLargeFloat strictlyPositive not ).      
+    self assert:( 1.0 asLargeFloat strictlyPositive ).      
+    self assert:( -1.0 asLargeFloat strictlyPositive not ).      
+
+    self assert:( 0.0 asLargeFloat sign == 0 ).      
+    self assert:( 1.0 asLargeFloat sign == 1 ).      
+    self assert:( -1.0 asLargeFloat sign == -1 ).      
+
+    "
+     self basicNew test09_Testing
+    "
+! !
+
+!LargeFloatTest class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RegressionTests__MetaNumbersTest.st	Sat Jun 21 12:02:34 2003 +0200
@@ -0,0 +1,194 @@
+"{ Package: 'exept:regression' }"
+
+"{ NameSpace: RegressionTests }"
+
+TestCase subclass:#MetaNumbersTest
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'tests-Regression'
+!
+
+
+!MetaNumbersTest methodsFor:'tests'!
+
+test01_Nan
+    "NaN in all avaliable formats."
+
+    |check|
+
+    check := [:nan |
+        self assert:( nan isNaN ).
+        self assert:( nan isFinite not ).
+
+        nan isLimitedPrecisionReal ifTrue:[ 
+            self assert:( nan asFloat isNaN ).
+            self assert:( nan asLargeFloat isNaN ).
+            self assert:( nan asShortFloat isNaN ).
+            self assert:( nan asLongFloat isNaN ).
+        ].
+
+        "/ self assert:( nan asFraction isNaN ).
+        "/ self assert:( nan asInteger isNaN ).
+        self should:[ nan asFraction ] raise:DomainError.
+        self should:[ nan asInteger ] raise:DomainError.
+
+        self assert:( nan + 1 ) isNaN.
+        self assert:( nan + 1.0 ) isNaN.
+        self assert:( nan + 1.0 asShortFloat ) isNaN.
+        self assert:( nan + 1.0 asLongFloat ) isNaN.
+        self assert:( nan + 1.0 asLargeFloat ) isNaN.
+
+        self assert:( 1 + nan ) isNaN.
+        self assert:( 1.0 + nan ) isNaN.
+        self assert:( 1.0 asShortFloat + nan ) isNaN.
+        self assert:( 1.0 asLongFloat + nan ) isNaN.
+        self assert:( 1.0 asLargeFloat + nan ) isNaN.
+
+        self assert:( nan - 1 ) isNaN.
+        self assert:( nan - 1.0 ) isNaN.
+        self assert:( nan - 1.0 asShortFloat ) isNaN.
+        self assert:( nan - 1.0 asLongFloat ) isNaN.
+        self assert:( nan - 1.0 asLargeFloat ) isNaN.
+
+        self assert:( 1 - nan ) isNaN.
+        self assert:( 1.0 - nan ) isNaN.
+        self assert:( 1.0 asShortFloat - nan ) isNaN.
+        self assert:( 1.0 asLongFloat - nan ) isNaN.
+        self assert:( 1.0 asLargeFloat - nan ) isNaN.
+
+        self assert:( nan * 1 ) isNaN.
+        self assert:( nan * 1.0 ) isNaN.
+        self assert:( nan * 1.0 asShortFloat ) isNaN.
+        self assert:( nan * 1.0 asLongFloat ) isNaN.
+        self assert:( nan * 1.0 asLargeFloat ) isNaN.
+
+        self assert:( 1 * nan ) isNaN.
+        self assert:( 1.0 * nan ) isNaN.
+        self assert:( 1.0 asShortFloat * nan ) isNaN.
+        self assert:( 1.0 asLongFloat * nan ) isNaN.
+        self assert:( 1.0 asLargeFloat * nan ) isNaN.
+
+        self assert:( nan / 1 ) isNaN.
+        self assert:( nan / 1.0 ) isNaN.
+        self assert:( nan / 1.0 asShortFloat ) isNaN.
+        self assert:( nan / 1.0 asLongFloat ) isNaN.
+        self assert:( nan / 1.0 asLargeFloat ) isNaN.
+
+        self assert:( 1 / nan ) isNaN.
+        self assert:( 1.0 / nan ) isNaN.
+        self assert:( 1.0 asShortFloat / nan ) isNaN.
+        self assert:( 1.0 asLongFloat / nan ) isNaN.
+        self assert:( 1.0 asLargeFloat / nan ) isNaN.
+    ].
+
+    check value:(0.0 uncheckedDivide: 0.0).
+    check value:(0.0 asShortFloat uncheckedDivide: 0.0).
+    check value:(0.0 asLongFloat uncheckedDivide: 0.0).
+    check value:(0.0 asLargeFloat uncheckedDivide: 0.0).
+    check value:(0 uncheckedDivide: 0).
+
+    "
+     self basicNew test01_Nan
+    "
+!
+
+test02_Inf
+    "Infinity in all avaliable formats."
+
+    |check posInf negInf|
+
+    check := 
+        [:v1 :v2 |
+
+            posInf := v1 uncheckedDivide: v2.
+            negInf := v1 negated uncheckedDivide: v2.
+
+            v1 isLimitedPrecisionReal ifTrue:[ 
+                self assert:( posInf isMemberOf:v1 class ).
+                self assert:( negInf isMemberOf:v1 class ).
+            ].
+            self assert:( posInf isNaN not ).
+            self assert:( posInf isFinite not ).
+            self assert:( posInf isInfinite ).
+            self assert:( posInf positive ).
+            self assert:( posInf negative not ).
+            self assert:( posInf isNegativeInfinity not).
+            self assert:( posInf isPositiveInfinity ).
+
+            self assert:( negInf isNaN not ).
+            self assert:( negInf isFinite not ).
+            self assert:( negInf isInfinite ).
+            self assert:( negInf positive not).
+            self assert:( negInf negative ).
+            self assert:( negInf isNegativeInfinity ).
+            self assert:( negInf isPositiveInfinity not ).
+
+            self assert:( negInf + negInf = negInf).
+            self assert:( posInf + posInf = posInf).
+            "/ self assert:( negInf + posInf) isNaN.
+            self assert:( Number undefinedResultSignal ignoreIn:[ negInf + posInf]) isNaN.
+            "/ self should:[ negInf + posInf ] raise:Number undefinedResultSignal.
+            self assert:( Number undefinedResultSignal ignoreIn:[ posInf + negInf]) isNaN.
+
+            self assert:( negInf - posInf = negInf).
+            self assert:( Number undefinedResultSignal ignoreIn:[ negInf - negInf]) isNaN.
+            self assert:( posInf - negInf = posInf).
+            self assert:( Number undefinedResultSignal ignoreIn:[ posInf - posInf]) isNaN.
+
+            self assert:( posInf + v1) = posInf.
+            self assert:( posInf - v1) = posInf.
+            self assert:( negInf + v1) = negInf.
+            self assert:( negInf - v1) = negInf.
+
+            self assert:( posInf + 1) = posInf.
+            self assert:( posInf + 1.0) = posInf.
+            self assert:( posInf + 1.0 asShortFloat) = posInf.
+            self assert:( posInf + 1.0 asLongFloat) = posInf.
+            self assert:( posInf + 1.0 asLargeFloat) = posInf.
+            self assert:( posInf + (1/2)) = posInf.
+            self assert:( posInf + 100 factorial) = posInf.
+
+            self assert:( negInf + 1) = negInf.
+            self assert:( negInf + 1.0) = negInf.
+            self assert:( negInf + 1.0 asShortFloat) = negInf.
+            self assert:( negInf + 1.0 asLongFloat) = negInf.
+            self assert:( negInf + 1.0 asLargeFloat) = negInf.
+            self assert:( negInf + (1/2)) = negInf.
+            self assert:( negInf + 100 factorial) = negInf.
+
+            self assert:( 1 + posInf) = posInf.
+            self assert:( 1.0 + posInf) = posInf.
+            self assert:( 1.0 asShortFloat + posInf) = posInf.
+            self assert:( 1.0 asLongFloat + posInf) = posInf.
+            self assert:( 1.0 asLargeFloat + posInf) = posInf.
+            self assert:( (1/2) + posInf) = posInf.
+            self assert:( 100 factorial + posInf) = posInf.
+
+            self assert:( 1 + negInf) = negInf.
+            self assert:( 1.0 + negInf) = negInf.
+            self assert:( 1.0 asShortFloat + negInf) = negInf.
+            self assert:( 1.0 asLongFloat + negInf) = negInf.
+            self assert:( 1.0 asLargeFloat + negInf) = negInf.
+            self assert:( (1/2) + negInf) = negInf.
+            self assert:( 100 factorial + negInf) = negInf.
+
+        ].
+
+    check value: 1.0 value: 0.0.
+    check value: 1.0 asShortFloat value: 0.0 asShortFloat.
+    check value: 1.0 asLongFloat value: 0.0 asLongFloat.
+    check value: 1.0 asLargeFloat value: 0.0 asLargeFloat.
+
+    check value: 1 value: 0.
+
+    "
+     self basicNew test02_Inf
+    "
+! !
+
+!MetaNumbersTest class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+! !