[Trilinos-Users] precision double in for Teuchos XMLObject ostream

Hoemmen, Mark mhoemme at sandia.gov
Sun Aug 19 10:52:30 MDT 2012


Hi Markus (and other Trilinos users),

I just pushed a fix to this bug (listed as Bug 5665 in our Bugzilla tracking system), which you should now be able to access from our public Git repository.  I'm still working out a compile issue with the fix on Windows MSVC, but it should otherwise work just fine.  Do let me know if you have any further troubles.

btw this should fix output of both ArrayView and Array, as you observed, since Array's toString() method just calls ArrayView's toString() method.

mfh

On Aug 17, 2012, at 12:14 PM, "Hoemmen, Mark" <mhoemme at sandia.gov> wrote:
> Thanks, Markus, for pointing this out.  It should be easy for us to fix this by having the specialization of toString for ArrayView<T> simply use the specialization of toString for T.  Right now, it uses operator<< directly in objects of type T, instead of deferring to T's toString specialization.  I will file a Teuchos bug for this; if you are interested in tracking progress, please e-mail me directly.
> 
> Thanks!
> mfh
> 
> 
> On Aug 17, 2012, at 12:00 PM, "trilinos-users-request at software.sandia.gov" <trilinos-users-request at software.sandia.gov> wrote:
>> Message: 1
>> Date: Thu, 16 Aug 2012 12:56:09 -0600
>> From: "Markus Berndt" <berndt at lanl.gov>
>> Subject: Re: [Trilinos-Users] precision double in for Teuchos
>>   XMLObject ostream
>> To: "Hoemmen, Mark" <mhoemme at sandia.gov>
>> Cc: "trilinos-users at software.sandia.gov"
>>   <trilinos-users at software.sandia.gov>
>> Message-ID: <1345143369.3423.10.camel at handel.lanl.gov>
>> Content-Type: text/plain; charset=utf-8
>> 
>> It looks like this fix described by Mark (see below in the quoted email)
>> was included in 10.12. However, for Array<double> and Array<float> the
>> problem persists. 
>> 
>> I believe that the function
>> 
>> std::string ArrayView<T>::toString() const
>> 
>> needs to be updated/specialized such that for T=double and T=float high
>> enough precision is used to represent a number accurately in the XML
>> file.
>> 
>> - Markus
>> 
>> 
>> On Mon, 2012-03-05 at 04:51 +0000, Hoemmen, Mark wrote:
>>> On Sat 03 Mar 2012 at 16:12, George Pau <gpau at lbl.gov> wrote:
>>>> I have a code that read in an XML file, save it as a ParameterList
>>>> and then write it to a new XML file again.  What I notice is that
>>>> the precision of parameter of type double drops in the new XML file.
>>>> For example, even though I specified 7 decimal points in the
>>>> original XML file, my new XML file shows the same value to only 5
>>>> decimal points.  Is there any way that I can maintain the precision
>>>> in my new XML file?
>>> 
>>> I took a brief look at the conversion code, and it seems like the
>>> issue is with Teuchos::ToStringTraits.  This traits class implements
>>> conversion to strings (via Teuchos::toString()) for different types T.
>>> The default implementation of ToStringTraits creates an
>>> std::ostringstream, writes the object of type T to the ostringstream,
>>> and returns the std::string version of the ostringstream.  Teuchos
>>> does not override ToStringTraits for floating-point types, so
>>> toString() uses the default implementation in that case.
>>> 
>>> This would explain why setting the precision of floating-point data in
>>> the output file, as you do, has no effect.  The XML output code first
>>> converts the floating-point value to a string (via toString()), then
>>> writes the string.  This bypasses the precision you set for the output
>>> file.
>>> 
>>> This is really a bug that we should fix, so thank you for pointing
>>> this out!  If you need a workaround, you could simply specialize
>>> Teuchos::ToStringTraits for T = double, using an excessive precision.
>>> I like to use round(52 * log10(2)) + 1 = 17 for double-precision real
>>> values (please feel free to correct me if I've gotten this wrong).
>>> 
>>> namespace Teuchos {
>>> template<>
>>> class ToStringTraits<double> {
>>> public:
>>> static std::string toString (const double& t) {
>>>   std::ostringstream os;
>>>   os.setf (std::ios::scientific);
>>>   os.precision (17);
>>>   os << t;
>>>   return os.str();
>>> }
>>> };
>>> 
>>> There is, in fact, an algorithm, due to Guy Steele (yes, Java's Guy
>>> Steele) et al., for idempotent printing of finite-length
>>> floating-point values.  One of these days it would be nice for us to
>>> take the time to implement that algorithm and test it carefully.  For
>>> now, cranking up the precision works fine.
>>> 
>>> Best,
>>> mfh
>>> 
>>> _______________________________________________
>>> Trilinos-Users mailing list
>>> Trilinos-Users at software.sandia.gov
>>> http://software.sandia.gov/mailman/listinfo/trilinos-users
>>> 
>> 
>> -- 
>> Markus Berndt -- LANL CCS-2 -- (505) 665-4711
>> 
>> 
>> 
>> 
>> ------------------------------
>> 
>> _______________________________________________
>> Trilinos-Users mailing list
>> Trilinos-Users at software.sandia.gov
>> http://software.sandia.gov/mailman/listinfo/trilinos-users
>> 
>> 
>> End of Trilinos-Users Digest, Vol 84, Issue 10
>> **********************************************



More information about the Trilinos-Users mailing list