KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have C++/C mixed code which I build on a) Visual C++ 2010 Express(Free version) on Win-7 x32. b) Cygwin/Gcc environment installed on a Windows-7 Home premium edition x32. The gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125) c) Ubuntu 10.04 Linux- GCC version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) I have a code as below(Its a member function for my user defined class) which computes absolute value of the passed object myhalf- myhalf::myhalfabs(myhalf a) { float tmp; tmp = abs(a.value); //This abs is from math.h :- float abs(float) return tmp; } This is working perfectly as desired in MS - Visual C++ 2010. abs() of -ve nos were returned correctly as +ve nos having same value. Strangely when I built this code on b) Cygwin/gcc environment & c) Linux-gcc 4.4.3 mentioned above, I was getting junk output. So fired up gdb, and after lot of sweat and 'binary-search approach' on the code to decide where it started going wrong, I hit this piece of code as shown above : tmp = abs(a.value); which was behaving strangely under cygwin/gcc. For -ve numbers abs() was returning 0(zero). WTF?? Then as a work around, avoided calling abs() from stdlib, and coded my own abs as below: myhalf::myhalfabs(myhalf a) { float tmp; unsigned int tmp_dbg; // tmp = abs(a.value); tmp_dbg = *(unsigned int*)(&a.value); tmp_dbg = tmp_dbg & 0x7FFFFFFF; tmp = *(float*)(&tmp_dbg); return tmp; } This worked fine on cygwin/gcc & linux-gcc and output was as desired, And of course it worked fine on MS-Visual C++ 2010. This is the whole Makefile for the cygwin/gcc and linux-gcc builds, I use. Just if anyone supspects something fishy there:- OBJS= <all my obj files listed here explicitly> HEADERS= <my header files here> CFLAGS= -Wall LIBS= -lm LDFLAGS= $
Tags (comma-separated)
Save Edits
Cancel