help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] [PATCH] Don't trust *_DIG


From: Paolo Bonzini
Subject: [Help-smalltalk] [PATCH] Don't trust *_DIG
Date: Thu, 24 May 2007 14:12:47 +0200
User-agent: Thunderbird 2.0.0.0 (Macintosh/20070326)

FloatE has 24 bits of precision, but Mac OS reports it as having 6 significant digits. Unluckily, 2.71828 is not enough to print "e" correctly, for example. We need 2.7182818, i.e. ceil (24 * log10 2) digits of precision.

This patch fixes it.

Paolo
2007-05-24  Paolo Bonzini  <address@hidden>

        * libgst/dict.c: Don't trust {FLT,DBL,LDBL}_DIG.

--- orig/libgst/dict.c
+++ mod/libgst/dict.c
@@ -1118,7 +1118,7 @@ init_c_symbols ()
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CDoubleNaN"),
                    floatd_new ((double) NAN));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CDoubleDigits"),
-                   FROM_INT (DBL_DIG));
+                   FROM_INT (ceil (DBL_MANT_DIG) * 0.301029995663981));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CDoubleBinaryDigits"),
                    FROM_INT (DBL_MANT_DIG));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CDoubleMinExp"),
@@ -1139,7 +1139,7 @@ init_c_symbols ()
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CFloatMax"),
                    floate_new (FLT_MAX));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CFloatDigits"),
-                   FROM_INT (FLT_DIG));
+                   FROM_INT (ceil (FLT_MANT_DIG) * 0.301029995663981));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CFloatBinaryDigits"),
                    FROM_INT (FLT_MANT_DIG));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CFloatMinExp"),
@@ -1160,7 +1160,7 @@ init_c_symbols ()
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CLongDoubleMax"),
                    floatq_new (LDBL_MAX));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CLongDoubleDigits"),
-                   FROM_INT (LDBL_DIG));
+                   FROM_INT (ceil (LDBL_MANT_DIG) * 0.301029995663981));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string 
("CLongDoubleBinaryDigits"),
                    FROM_INT (LDBL_MANT_DIG));
   NAMESPACE_AT_PUT (cSymbolsOOP, _gst_intern_string ("CLongDoubleMinExp"),

reply via email to

[Prev in Thread] Current Thread [Next in Thread]