Strange value of the double type variable: -nan(0x8000000000000)


 
Thread Tools Search this Thread
Top Forums Programming Strange value of the double type variable: -nan(0x8000000000000)
# 1  
Old 05-30-2014
Strange value of the double type variable: -nan(0x8000000000000)

I am confused by the value of "currdisk->currangle" after adding operation. Initially the value of "currdisk->currangle" is 0.77500000000000013, but after adding operation, it's changed to "-nan(0x8000000000000)", Can anyone explain ? Thanks! The following is the occasion of gdb debugging.

Code:
3338          currdisk->currangle += (simtime - seg->time) / currdisk->rotatetime;
(gdb) p currdisk->currangle
$28 = 0.77500000000000013
(gdb) p (simtime - seg->time) / currdisk->rotatetime
$29 = 0.00833333333333325
(gdb) p (simtime - seg->time) 
$30 = 0.092592592592591672
(gdb) p currdisk->rotatetime
$31 = 11.111111111111111
(gdb) n

(gdb) p currdisk->currangle 
$32 = -nan(0x8000000000000)
(gdb) p/x (char[8])currdisk->currangle 
$52 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xff}
(gdb)

Then I change
currdisk->currangle += (simtime - seg->time) / currdisk->rotatetime ;
to
double tmp1 = (simtime - seg->time) / currdisk->rotatetime;
currdisk->currangle += tmp1;

The value of currdisk->currangle is normal. Can anyone explain the confusing phenomenon ?

---------- Post updated 05-30-14 at 02:25 AM ---------- Previous update was 05-29-14 at 10:56 PM ----------

All are double type.
# 2  
Old 05-30-2014
First, take a long hard long at the currdisk structure. If there is any chance that (double)currdisk->currangle and (double)currdisk->rotatetime overlap that is your problem. Having these overlap is the only reasonable explanation that I see. When you introduced tmpl you hide the fact that both are in operation at the same time.
This User Gave Thanks to Perderabo For This Post:
# 3  
Old 05-30-2014
Both (double)currdisk->currangle and (double)currdisk->rotatetime are defined in one struct obviously, the overlap between the two elements is impossible. After I introduced tmp1, sometimes I get NaN, sometimes I get normal value.
Maybe the bug of Linux, is it possible?
# 4  
Old 05-30-2014
It is possible that it is a compiler bug. It wouldn't be the first. But it's more likely that it's a bug in your code somehow. Everybody who ever has a mysterious bug that they can't find will almost always point a finger at the compiler. And they are right about 1% of the time.
# 5  
Old 05-30-2014
assembly code
Code:
       tmp1 = (simtime - seg->time) / currdisk->rotatetime;
0x0808fdf4  <disk_buffer_sector_done+559>:  fldl   0x80b2208
0x0808fdfa  <disk_buffer_sector_done+565>:  mov    -0x38(%ebp),%eax
0x0808fdfd  <disk_buffer_sector_done+568>:  fldl   (%eax)
0x0808fdff  <disk_buffer_sector_done+570>:  fsubrp %st,%st(1)
0x0808fe01  <disk_buffer_sector_done+572>:  mov    0x8(%ebp),%eax
0x0808fe04  <disk_buffer_sector_done+575>:  fldl   0xc4(%eax)
0x0808fe0a  <disk_buffer_sector_done+581>:  fdivrp %st,%st(1)
0x0808fe0c  <disk_buffer_sector_done+583>:  fstpl  -0x28(%ebp)
      currdisk->currangle += tmp1;
0x0808fe0f  <disk_buffer_sector_done+586>:  mov    0x8(%ebp),%eax
0x0808fe12  <disk_buffer_sector_done+589>:  fldl   0x284(%eax)
0x0808fe18  <disk_buffer_sector_done+595>:  faddl  -0x28(%ebp)
0x0808fe1b  <disk_buffer_sector_done+598>:  mov    0x8(%ebp),%eax
0x0808fe1e  <disk_buffer_sector_done+601>:  fstpl  0x284(%eax)


Last edited by 915086731; 05-30-2014 at 10:01 AM..
# 6  
Old 05-30-2014
The only thing I have to suggest will be a lot of work. Write a tiny workable fragment of code that will set up your initial values. Then execute:
Code:
currdisk->currangle += (simtime - seg->time) / currdisk->rotatetime ;

And then have a printf to display the result. This will probably work reliably.

Now, bit by bit, add a few lines from your original program to the fragment. After each addition, retest. Eventually you will add a few lines that break the program. That will be enough of a clue to find your bug. (The only other possible outcome is that you will have a complete second copy of original program that somehow works correctly. Use diff to find out why.)
# 7  
Old 05-30-2014
FWIW:

I have had code run correctly when compiled for debug, and fail when not compiled that way. Rare.

Similar issues with levels of optimization. Also rare. Same with a 32bit compile versus a 64bit compile. Only once - it was a code issue.

To eliminate compiler complications:

Code:
gcc -O0 yourprog.c -o  yourprog -lm

I would guess you have a make file but turn off all optimizations. Run the code.
If it runs and you are positive there are no coding errors, then it may be an optimization doing something untoward.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Bash - concatenate string - strange variable scoping

Hello, I am trying to concatenate a string in a bash script like this: runCmd="docker run -e \"IMAGE_NAME=$IMAGE_NAME\" " env | grep "$ENV_SUFFIX" | while read line; do envCmd="-e \"${line}\" " runCmd=$runCmd$envCmd echo $runCmd # here concatenation works fine done echo... (3 Replies)
Discussion started by: czabak
3 Replies

2. Red Hat

Double data type C Red Hat platform problem

I'm converting a binary file to ASCII using c code. The folllowing block of code prints correct double value 00000.000000000 on HPUNIX platform. longi double; /* C79 - Price Per Minute */ memcpy(&longi,&rbuff,8); fprintf(wfp,"%015.9f ",longi); prints : 00000.000000000 ... (6 Replies)
Discussion started by: krk
6 Replies

3. Shell Programming and Scripting

Strange Phenomena with records filed in variable

Trying to find out whether there is a limit for the number of records that can be stored in a variable I set up this small script: #!/usr/bin/ksh for ((i = 1; i < 21; i++)) do n=$(($i*100)) echo "Trying $n records:" recs=$(head -$n error.log) echo "$recs" | wc done ... (9 Replies)
Discussion started by: Cochise
9 Replies

4. Shell Programming and Scripting

Strange type mistake?!

Hi, I want to start MY_PROGRAM in a bash script with additional parameters given in the CONFIGURATION_ARRAY. IFS="'" CONFIGURATION_ARRAY=( '-N 0 -m 0' '-N 0 -m 1' ) for configuration in ${CONFIGURATION_ARRAY} do //DEBUG N=${configuration%-*} //-N 0 M=-${configuration##*-} //-m 0... (5 Replies)
Discussion started by: xraystorm
5 Replies

5. Shell Programming and Scripting

What is a type of this variable?

I have a question about the type of this variable checkU= sudo cat /etc/passwd: grep $uname: wc -l I write a script to check the existent of username that get from the keyboard. If there is no username,it will create the username else it show the 'Duplicate name" message. The problem is it... (4 Replies)
Discussion started by: thsecmaniac
4 Replies

6. Shell Programming and Scripting

Strange variable comparison result in awk

So, I'm making a little awk script that generates a range-based histogram of a set of numbers. I've stumbled onto a strange thing. Toward the end of the process, I have this test: if ( bindex < s ) "bindex" is the "index" of my "bin" (the array element that gets incremented whenever a... (2 Replies)
Discussion started by: treesloth
2 Replies

7. Shell Programming and Scripting

Perl variable type assessment

Hello experts, How we can find out,that what is type of a scalar variable? i.e a scalar var contain a number or a string. Thanks in advance. (8 Replies)
Discussion started by: Zaxon
8 Replies

8. Shell Programming and Scripting

getting type of variable

Hello: Is there any way to tell the type of a passed or entered variable, if it is a string or integer,...etc. Thanks a lot (2 Replies)
Discussion started by: aladdin
2 Replies

9. Shell Programming and Scripting

how to get type of variable in perl

hello all how can i get the type of variable in perl like typeof(var); in javascript for instance ? to know if the variable is int or string ? (2 Replies)
Discussion started by: umen
2 Replies

10. Shell Programming and Scripting

Problem with variable type

Dear All, I am trying to write an script to calculate geometric centre of selected residues of a protein structure. Say I have a PDB file (a text containing the x, y, and z coordinates of atoms of a protein). I want to extract the X coordinates of the atoms belonging to the interested residues... (2 Replies)
Discussion started by: siavoush
2 Replies
Login or Register to Ask a Question