Browse Source

* Infinite loop for infinite value problem fixed

pierre 26 years ago
parent
commit
c1f893a1d1
1 changed files with 56 additions and 1 deletions
  1. 56 1
      rtl/inc/real2str.inc

+ 56 - 1
rtl/inc/real2str.inc

@@ -24,6 +24,43 @@ const
    i2  : longint = 2;
    i1  : longint = 1;
 
+   { we can use this conditional if the Inf const is defined
+     in processor specific code PM }
+{$ifdef FPC_HAS_INFINITY_CONST}
+   {$define FPC_INFINITY_FOR_REAL2STR}
+{$else not  FPC_HAS_INFINITY_CONST}
+   { To avoid problems with infinity just
+     issue it in byte representation to be endianness independant PM }
+{$ifndef FPC_INFINITY_FOR_REAL2STR}
+{$ifdef SUPPORT_EXTENDED}
+   { extended is not IEEE so its processor specific
+     so I only allow it for i386 PM }
+{$ifdef i386}
+   {$define FPC_INFINITY_FOR_REAL2STR}
+   InfArray : {extended} array[0..9] of byte = ($0,$0,$0,$0,$0,$0,$0,$80,$ff,$7f);
+{$endif i386}
+{$endif SUPPORT_EXTENDED}
+{$endif not FPC_INFINITY_FOR_REAL2STR}
+
+{$ifndef FPC_INFINITY_FOR_REAL2STR}
+{$ifdef SUPPORT_DOUBLE}
+   {$define FPC_INFINITY_FOR_REAL2STR}
+   InfArray : {double} array[0..9] of byte = ($0,$0,$0,$0,$0,$0,$f0,$7f);
+{$endif SUPPORT_DOUBLE}
+{$endif not FPC_INFINITY_FOR_REAL2STR}
+
+{$ifndef FPC_INFINITY_FOR_REAL2STR}
+{$ifdef SUPPORT_SINGLE}
+   {$define FPC_INFINITY_FOR_REAL2STR}
+   InfArray : {single} array[0..3] of byte = ($0,$0,$80,$7f);
+{$endif SUPPORT_SINGLE}
+{$endif not FPC_INFINITY_FOR_REAL2STR}
+
+{$ifndef FPC_INFINITY_FOR_REAL2STR}
+    {$warning don't know Infinity values }
+{$endif not FPC_INFINITY_FOR_REAL2STR}
+{$endif not FPC_HAS_INFINITY_CONST}
+
 Procedure str_real (len,f : longint; d : ValReal; real_type :treal_type; var s : string);
 {
   These numbers are for the double type...
@@ -103,6 +140,21 @@ begin
   { for the same reason I converted d:=frac(d) to d:=d-int(d); (PM) }
   if sign then
     d:=-d;
+
+{$ifdef FPC_INFINITY_FOR_REAL2STR}
+{$ifndef FPC_HAS_INFINITY_CONST}
+    if d=ValReal(InfArray) then
+{$else FPC_HAS_INFINITY_CONST}
+    if d=Inf then
+{$endif FPC_HAS_INFINITY_CONST}
+      begin
+        if sign then
+          s:='-Inf'
+        else
+          s:='Inf';
+        exit;
+      end;
+{$endif FPC_INFINITY_FOR_REAL2STR}
   { determine precision : maximal precision is : }
   currprec:=maxlen-explen-3;
   { this is also the maximal number of decimals !!}
@@ -234,7 +286,10 @@ end;
 
 {
   $Log$
-  Revision 1.17  1999-11-03 09:54:24  peter
+  Revision 1.18  1999-11-28 23:57:23  pierre
+   * Infinite loop for infinite value problem fixed
+
+  Revision 1.17  1999/11/03 09:54:24  peter
     * another fix for precision
 
   Revision 1.16  1999/11/03 00:55:09  pierre