From ripley at stats.ox.ac.uk  Tue May 26 12:01:40 2009
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Tue, 26 May 2009 11:01:40 +0100 (BST)
Subject: [Rd] [R] sprintf() question
In-Reply-To: <dc41e1260905172340hefd20f0h7c23c9a07e86391f@mail.gmail.com>
References: <993B311E57784D70BE4BDF3BAA154A27@Aragorn>
	<XFMail.090517233222.Ted.Harding@manchester.ac.uk>
	<C474D7D640144C34A7BE353F065102BD@Aragorn>
	<dc41e1260905172340hefd20f0h7c23c9a07e86391f@mail.gmail.com>
Message-ID: <alpine.LFD.2.00.0905261052570.25521@gannet.stats.ox.ac.uk>

Thank you, incorporated now.

As the help page says, %a is a C99 feature that is not available on 
all platforms.  The *printf in msvcrt.dll is a long way from 
C99-compatible (it dates from ca 10 years ago, but later VC runtimes 
are also incompatible).  Recently MinGW has attempted to supplement 
it, not very comprehensively.

Quite a while ago we switched R for Windows to use the trio emulation 
of *printf, which is intended to be compatible with C99.  This was a 
bug in a bugfix to trio (there have been quite a few bugfixes).


On Mon, 18 May 2009, Ei-ji Nakama wrote:

> Hi
>
> The result of Windows is clearly strange.
>
> ================ my Linux machine =?good =======================
>> sessionInfo()
> R version 2.9.0 (2009-04-17)
> x86_64-pc-linux-gnu
>
> locale:
> LC_CTYPE=ja_JP.EUC-JP;LC_NUMERIC=C;LC_TIME=ja_JP.EUC-JP;LC_COLLATE=ja_JP.EUC-JP;
> LC_MONETARY=C;LC_MESSAGES=ja_JP.EUC-JP;LC_PAPER=ja_JP.EUC-JP;LC_NAME=C;LC_ADDRES
> S=C;LC_TELEPHONE=C;LC_MEASUREMENT=ja_JP.EUC-JP;LC_IDENTIFICATION=C
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>> sprintf("%a",1:8)
> [1] "0x1p+0"   "0x1p+1"   "0x1.8p+1" "0x1p+2"   "0x1.4p+2" "0x1.8p+2" "0x1.cp+2"
> [8] "0x1p+3"
>
> ================ my Windows machine = OMG ======================
>> sessionInfo()
> R version 2.9.0 (2009-04-17)
> i386-pc-mingw32
>
> locale:
> LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>> sprintf("%a",1:8)
> [1] "0x1p+0"            "0x1"               "0x1.8"
> "0x1p+4294967294"
> [5] "0x1.4p+4294967294" "0x1.8p+4294967294" "0x1.cp+4294967294"
> "0x1p+4294967293"
>
> The result improved when I changed handling of uExponent as follows
>
> http://prs.ism.ac.jp/?nakama/working/sprintf_format_a.patch
>
>
>
> 2009/5/18 Daniel Nordlund <djnordlund at verizon.net>:
>>> -----Original Message-----
>>> From: Ted Harding [mailto:Ted.Harding at manchester.ac.uk]
>>> Sent: Sunday, May 17, 2009 3:32 PM
>>> To: Daniel Nordlund
>>> Cc: r-help at r-project.org
>>> Subject: RE: [R] sprintf() question
>>>
>>> On 17-May-09 22:03:19, Daniel Nordlund wrote:
>>>> When I type the following, I get results different from what I
>>>> expected.
>>>>
>>>>> sprintf('%a',3)
>>>> [1] "0x1.8"
>>>>
>>>> Shouldn't the result be
>>>>
>>>> [1] "0x1.8p+2"
>>>
>>> Well, not "p+2" but "p+1"
>>>   (0x1.8 = 1.1000[2] ; *2 = 11.000[2] = 3[10]) ;
>>> however, I get:
>>>
>>>   sprintf('%a',3)
>>>   # [1] "0x1.8p+1"
>>>
>>> which is indeed correct.
>>>
>>>   R version 2.9.0 (2009-04-17) ## Same as yours
>>>   platform  i486-pc-linux-gnu  ## Different from yours ...
>>>
>>> which perhaps suggests that there may be a mis-compilation in the
>>> Windows version.
>>>
>>> Ted.
>>>
>>>> I read through the help ?sprintf and didn't find anything
>>> that changed
>>>> my expectation.  What am I misunderstanding?  I am using
>>> R-2.9.0 binary
>>>> from CRAN on Windows XP Pro, and my session info is
>>>>
>>>>
>>>>> sessionInfo()
>>>> R version 2.9.0 (2009-04-17)
>>>> i386-pc-mingw32
>>>>
>>>> locale:
>>>> LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
>>>> States.1252;LC_MONETARY=English_United
>>>> States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
>>>>
>>>> attached base packages:
>>>> [1] stats     graphics  grDevices utils     datasets
>>> methods   base
>>>>>
>>>>
>>>> Thanks for any enlightenment.
>>>>
>>
>> Thanks Ted!
>>
>> Enlightenment is what I asked for, and it is what I got.  I was having a
>> senior moment I guess.  I was picturing 8 as binary 0100, when obviously it
>> is binary 1000.  So yes, the required power of 2 is 1, and it is fine with
>> me that Windows implementation does not display it.  Thanks again.
>>
>> Dan
>>
>> Daniel Nordlund
>> Bothell, WA  USA
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>
>>
>
> -- 
> EI-JI Nakama  <nakama (a) ki.rim.or.jp>
> "?u4e2d?u9593?u6804?u6cbb"  <nakama (a) ki.rim.or.jp>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/?ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595


[Rd] [R] sprintf() question
Prof Brian Ripley