[Coin-discuss] Problem with MPS export / MSVC

John J Forrest jjforre at us.ibm.com
Thu Apr 1 14:49:52 EST 2004


Jörg,

With formatType 1 CoinMpsIO::writeMps() writes 18 digits of accuracy (well 
it does now).

I have modified code to take out leading zeros in exponent.  That should 
work as numbers > 1.0e40 are treated differently with formaType 0 so there 
will always be at least one 0 on Microsoft.

John Forrest



"Jörg Herbers" <herbers at hotmail.com> 
Sent by: coin-discuss-admin at www-124.southbury.usf.ibm.com
03/25/2004 10:11 AM
Please respond to
coin-discuss


To
coin-discuss at www-124.southbury.usf.ibm.com
cc

Subject
[Coin-discuss] Problem with MPS export / MSVC






I encountered a problem when exporting an mps file via CoinMpsIO. I work 
on 
Microsoft Visual Studio .NET 2003 which handles printf format 
specification 
flags somewhat different from e.g. the gcc compiler. The problem is that 
large "infinity" upper bounds are exported as "2.147484e+00", i.e. the 
exponent is 0. CoinMpsIO::writeMps() takes the minimum over the given 
upper 
bound and INT_MAX (2147483647). convertDouble() converts this to a string, 

using format specification "%12.7g". The resulting string is cut after 12 
characters according to the MPS specification for the BOUNDS section. But 
while gcc converts INT_MAX into 2.147484e+09, MS VC7 (and equally MS VC6) 
converts it into 2.147484e+009, and the final "9" at position 12 will be 
cut 
afterwards. The Microsoft documentation says that the exponent will always 

be typeset with three digits while gcc uses two digits for exponents <100. 
I 
don?t know if the C++ standard defines a "correct" behaviour.

I have solved the problem in my COIN code, but I would clearly prefer a 
general solution. Several ways are viable: On the one hand, the format 
specifications could generally be changed to "%12.6g". On the other hand, 
there could be a specific solution for the Microsoft compiler, e.g. by the 

above reduction of significant digits or by a manipulation of the 
resulting 
string, e.g. by something like

#if defined(_MSC_VER)
    if ((outputValue[9] == '+') && (outputValue[10] == '0'))
      strcpy(&(outputValue[10]), &(outputValue[11]));
#endif

I would be very glad if you could integrate a fix into the code.

Thanks a lot,
Jörg

_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE* 
http://join.msn.com/?page=features/junkmail

_______________________________________________
Coin-discuss mailing list
Coin-discuss at www-124.ibm.com
http://www-124.ibm.com/developerworks/oss/mailman/listinfo/coin-discuss

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/coin-discuss/attachments/20040401/a4ab6ea4/attachment.html>


More information about the Coin-discuss mailing list