<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:st1="urn:schemas-microsoft-com:office:smarttags" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><o:SmartTagType
 namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="PersonName"/>
<!--[if !mso]>
<style>
st1\:*{behavior:url(#default#ieooui) }
</style>
<![endif]-->
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";
        color:black;}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:blue;
        text-decoration:underline;}
pre
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:Arial;
        color:navy;}
@page Section1
        {size:595.3pt 841.9pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body bgcolor=white lang=SV link=blue vlink=blue>

<div class=Section1>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'>Here is an
interesting article:<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'>David Monniaux.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'>The pitfalls of
verifying floating-point computations.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'>ACM Transactions on
Programming Languages and Systems 30, 3 (2008) 12.<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'><a
href="http://hal.archives-ouvertes.fr/hal-00128124">http://hal.archives-ouvertes.fr/hal-00128124</a><o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'>Best regards,<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span lang=EN-US
style='font-size:12.0pt;font-family:Arial;color:windowtext'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span style='font-size:
12.0pt;font-family:Arial;color:windowtext'>Mikael Rittri<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span style='font-size:
12.0pt;font-family:Arial;color:windowtext'>Carmenta<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span style='font-size:
12.0pt;font-family:Arial;color:windowtext'>Sweden<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face=Arial><span style='font-size:
12.0pt;font-family:Arial;color:windowtext'>http://www.carmenta.com<o:p></o:p></span></font></p>

<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'><o:p> </o:p></span></font></p>

<div>

<div class=MsoNormal align=center style='text-align:center'><font size=3
color=black face="Times New Roman"><span lang=EN-US style='font-size:12.0pt;
color:windowtext'>

<hr size=2 width="100%" align=center tabindex=-1>

</span></font></div>

<p class=MsoNormal><b><font size=2 color=black face=Tahoma><span lang=EN-US
style='font-size:10.0pt;font-family:Tahoma;color:windowtext;font-weight:bold'>From:</span></font></b><font
size=2 color=black face=Tahoma><span lang=EN-US style='font-size:10.0pt;
font-family:Tahoma;color:windowtext'> proj-bounces@lists.maptools.org
[mailto:proj-bounces@lists.maptools.org] <b><span style='font-weight:bold'>On
Behalf Of </span></b>Calogero Mauceri<br>
<b><span style='font-weight:bold'>Sent:</span></b> Thursday, March 15, 2012
9:06 AM<br>
<b><span style='font-weight:bold'>To:</span></b> <st1:PersonName w:st="on">PROJ.4
 and general Projections Discussions</st1:PersonName><br>
<b><span style='font-weight:bold'>Subject:</span></b> Re: [Proj] Problems with
/Op option used to compile proj in Microsoft Visual Studio</span></font><font
color=black><span lang=EN-US style='color:windowtext'><o:p></o:p></span></font></p>

</div>

<p class=MsoNormal><font size=3 color=black face="Times New Roman"><span
style='font-size:12.0pt'><o:p> </o:p></span></font></p>

<p class=MsoNormal><font size=3 color=black face="Times New Roman"><span
style='font-size:12.0pt'>Hi Janne,<br>
<br>
<br>
<o:p></o:p></span></font></p>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt' type=cite><pre wrap=""><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>Disabling that option, the result returned in the version of proj <o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>compiled with Microsoft Visual C++ 2003 is more consistent.<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>Is there any reason why the /Op option is used to compile the proj?<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre></blockquote>

<pre wrap=""><font size=2 color=black face="Courier New"><span
style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>I think that the /Op option only works with the 2003 version and what it does is as follows<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>(text from MSDN):<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>"This option improves the consistency of floating-point tests for equality and inequality by disabling optimizations that could change the precision of floating-point calculations.<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>By default, the compiler uses the coprocessor's 80-bit registers to hold the intermediate results of floating-point calculations. This increases program speed and decreases program size. However, because the calculation involves floating-point data types that are represented in memory by less than 80 bits, carrying the extra bits of precision (80 bits minus the number of bits in a smaller floating-point type) through a lengthy calculation can produce inconsistent results."<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><a
href="http://msdn.microsoft.com/en-us/library/aa984742(v=vs.71).aspx">http://msdn.microsoft.com/en-us/library/aa984742(v=vs.71).aspx</a><o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>So it is rather obvious that MS compilers use the full 80 bit FPP registers in PC processors by default and in most cases and the reason for using that switch in the first place must be the idea to have similar performance with other ANSI compiler environments? I am not sure if this answered the question?<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'>regards: Janne.<o:p></o:p></span></font></pre><pre><font
size=2 color=black face="Courier New"><span style='font-size:10.0pt'><o:p> </o:p></span></font></pre>

<p class=MsoNormal><font size=3 color=black face="Times New Roman"><span
style='font-size:12.0pt'><br>
Ok, the /Op option seems to be used to produce consistent and repeatable
results.<br>
The problem is that the cost of that repeatability is that the intermidiate
results in computations *lose accuracy*.<br>
That explains the problem proj (compiled with Visual Studio 2003) is having in
the conversion I stated before.<br>
<br>
<br>
It is well explained here (text from MSDN) <br>
<br>
<a href="http://msdn.microsoft.com/en-us/library/aa289157%28v=vs.71%29.aspx">http://msdn.microsoft.com/en-us/library/aa289157%28v=vs.71%29.aspx</a><br>
<br>
"</span></font><font size=2 face="Segoe UI"><span style='font-size:10.0pt;
font-family:"Segoe UI"'><span style='orphans: 2;widows: 2;float:none;
word-spacing:0px'>Many C++ compilers offer a "consistency"
floating-point model, (through a /Op or /fltconsistency switch) which enables a
developer to create programs compliant with strict floating-point semantics.
When engaged, this model prevents the compiler from using most optimizations on
floating-point computations [...]. The consistency model, however, has a
dark-side. In order to return predictable results on different FPU
architectures, nearly all implementations of /Op round intermediate expressions
to the user specified precision; for example, consider the following
expression:<br>
<br>
<br>
</span></font><o:p></o:p></p>

</span><pre style='word-break:break-all'><font size=2 color=black
face=Consolas><span style='font-size:10.0pt;font-family:Consolas'>float a, b, c, d, e;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>. . .<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>a = b*c + d*e;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face="Segoe UI"><span
style='font-size:10.0pt;font-family:"Segoe UI"'><span style='orphans: 2;
widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'>In order to produce consistent and repeatable results under /Op, this expression gets evaluated as if it were implemented as follows:</span></span></font><font
face=Consolas><span style='font-family:Consolas'><o:p></o:p></span></font></pre>

<p class=MsoNormal><font size=3 color=black face="Times New Roman"><span
style='font-size:12.0pt'><br>
<br>
<o:p></o:p></span></font></p>

<pre style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>float x = b*c;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>float y = d*e;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>a = x+y;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face="Segoe UI"><span
style='font-size:10.0pt;font-family:"Segoe UI"'><span style='orphans: 2;
widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'>The final result now suffers from single-precision rounding errors<span
class=apple-converted-space> </span></span><i style='orphans: 2;
widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
word-spacing:0px'><span style='font-style:italic'>at each step in evaluating the expression</span></i></span></font><span
style='color:rgb(0, 0, 0  );-family: "Segoe UI", Verdana, Arial;
orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'><font face=Consolas><span style='font-family:Consolas'>. Although this interpretation doesn't strictly break any C++ semantics rules, it's almost never the best way to evaluate floating-point expressions. It is generally more desirable to</span></span></font><i
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
word-spacing:0px'><font face="Segoe UI"><span style='font-family:"Segoe UI";
font-style:italic'> compute the intermediate results in as high a s precis ion as is practical</span></font></i><span
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'><font face="Segoe UI"><span style='font-family:
"Segoe UI"'>. For instance, it would be better to compute the expression a=b*c+d*e in a higher precision as in,</span></span></font><font
face=Consolas><span style='font-family:Consolas'><o:p></o:p></span></font></pre><pre
style='word-break:break-all;word-wrap: break-word;overflow-x: auto;overflow-y: auto;
orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
word-spacing:0px'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>double x = b*c;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>double y = d*e;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>double z = x+y;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>a = (float)z;<o:p></o:p></span></font></pre>

<p class=MsoNormal><font size=3 color=black face="Times New Roman"><span
style='font-size:12.0pt'><br>
</span></font><font size=2 face="Segoe UI"><span style='font-size:10.0pt;
font-family:"Segoe UI"'><span style='orphans: 2;widows: 2;float:none;
word-spacing:0px'>or better yet<br>
<br>
<br>
</span></font><o:p></o:p></p>

</span><pre style='word-break:break-all'><font size=2 color=black
face=Consolas><span style='font-size:10.0pt;font-family:Consolas'>long double x = b*c;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>long double y = d*e<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>long double z = x+y;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'>a = (float)z;<o:p></o:p></span></font></pre><pre
style='word-break:break-all'><font size=2 color=black face=Consolas><span
style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></font></pre>

<p class=MsoNormal><font size=2 color=black face="Segoe UI"><span
style='font-size:10.0pt;font-family:"Segoe UI"'><span style='orphans: 2;
widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'>When computing the intermediate results in a
higher precision, the final result is *significantly more accurate*.
Ironically, by adopting a consistency model, the likelihood of error is
increased precisely when the user is trying to reduce error by disabling unsafe
optimizations. Thus the consistency model can seriously reduce efficiency while
simultaneously providing no guarantee of increased accuracy. To serious
numerical programmers, this doesn't seem like a very good tradeoff and is the
primary reason that the model is not generally well received.</span></span></font><br>
"<br>
<br>
>From Visual C++ 2005 they are suggesting to use other kind of options
fp:precise, fp:fast or fp:strict.<br>
<br>
<font size=2 face="Segoe UI"><span style='font-size:10.0pt;font-family:"Segoe UI"'><span
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'>"Under<span class=apple-converted-space> </span></span><b
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
word-spacing:0px'><span style='font-weight:bold'>fp:precise</span></b><span
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
float:none;word-spacing:0px'>, only safe optimizations are performed on
floating-point code and, unlike /Op, intermediate computations are consistently
performed at the highest<span class=apple-converted-space> </span></span><i
style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;-webkit-text-stroke-width: 0px;
word-spacing:0px'><span style='font-style:italic'>practical</span></i><span
class=apple-converted-space><span style='orphans: 2;widows: 2;-webkit-text-size-adjust: auto;
-webkit-text-stroke-width: 0px;float:none;word-spacing:0px'> </span>precision.</span></span></font>"<br>
<br>
Calogero<o:p></o:p></p>

</div>

</body>

</html>