The program: int main() { string test1 = "3.859155991718317e-06"; cout << test1 << " - " << test1.c_str() << " - " << std::atof(test1.c_str()) << endl; JvCreateJavaVM(__null); cout << test1 << " - " << test1.c_str() << " - " << std::atof(test1.c_str()) << endl; JvDetachCurrentThread(); cout << test1 << " - " << test1.c_str() << " - " << std::atof(test1.c_str()) << endl; return (0); } gives as an output: 3.859155991718317e-06 - 3.859155991718317e-06 - 3.85916e-06 3.859155991718317e-06 - 3.859155991718317e-06 - 3 3.859155991718317e-06 - 3.859155991718317e-06 - 3 Clearly once the VM is created no string to float conversion works.
Created attachment 6150 [details] Preprocessed file. Result of "g++ -save-temps -I /usr/include/libgcj-3.3.1 -lgcj test.cc"
Can you provide the __non__ preprocessed source? Also can you try 3.4.0 while you are at it?
Created attachment 6151 [details] Program that does create the bug Output of this program: 3.859155991718317e-06 - 3.859155991718317e-06 - 3.85916e-06 3.859155991718317e-06 - 3.859155991718317e-06 - 3 3.859155991718317e-06 - 3.859155991718317e-06 - 3
I cannot use the 3.4.0 version for now because I'm not "able" to install it in a proper way (I'm not admin and installing a new compiler in a local already led to problem last time we've done it).
I cannot reproduce it on i686-pc-linux-gnu running Redhat 7.3, running glibc 2.2.5 on 3.4.0, 3.3.3 or 3.5.0, so this is problem in your glibc because atof should be using the C locale always (read the C standard). There is no way around it, sorry except for updating your version of glibc.