先日やっていた計算式のコード.これをテストしていてエラーに.
エラーとなるコードの場所は数値を文字列に変換する所.
その部分だけを抜き出したコードは次の様なもの.
bool test (c_tstring& str_) { tstring str = str_ ; { TCHAR* endPtr = 0 ; double val = double(_tcstod(str.c_str(),&endPtr)) ; std::tout << std::fixed << val << std::endl ; // if (-1e50 < val && val < 1e50) { std::tout << std::fixed << val << std::endl ; } // else { std::tout << std::scientific << val << std::endl ; } } return true ; }
1e300 などの値を std::fixed で表示すると,限られた環境でビルドした exe でエラーになる.
エラーが確認できたのは VC 6 で MFC を使用しないでビルドしたもの.
VC 6 でも DLL でリンクしている場合は,ランタイムの DLL のバージョンにより大丈夫.
Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ c++ chk_big.cpp -Wall Iwao@AS5202T:/volume1/home/Iwao/gcc_test/Test/mba_20/chk_big $ ./a.out value ? =1e10 10000000000.000000 value ? =1e100 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000 value ? =1e200 99999999999999996973312221251036165947450327545502362648241750950346848435554075534196338404706251868027512415973882408182135734368278484639385041047239877871023591066789981811181813306167128854888448.000000 value ? =1e300 1000000000000000052504760255204420248704468581108159154915854115511802457988908195786371375080447864043704443832883878176942523235360430575644792184786706982848387200926575803737830233794788090059368953234970799945081119038967640880074652742780142494579258788820056842838115669472196386865459400540160.000000 value ? =1e400 inf value ? =1e307 9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000 value ? =1e308 100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000 value ? =1e309 inf value ? =-1e100 -10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000 value ? =-1e307 -9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000 value ? =-1e308 -100000000000000001097906362944045541740492309677311846336810682903157585404911491537163328978494688899061249669721172515611590283743140088328307009198146046031271664502933027185697489699588559043338384466165001178426897626212945177628091195786707458122783970171784415105291802893207873272974885715430223118336.000000 value ? =-1e309 -inf value ? =1.e-100 0.000000 value ? =1.e-300 0.000000