Hello all,
I expected to detect the NaN result after the Double-Precision Floating-Point operations
with the conventional condition: if(!(result == result))
But I have got some subitaneous results that depend from variables declarations and
from Optimization modes.
I used the following program:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "math.h"
void main(void)
{
double val2=-0.182147, val3=0.0, val4=0.0; //volatile double val2=-0.182147, val3=0.0, val4=0.0;
double result=3.3; //volatile double result=3.3;
result = sqrt(val2); // Square-Root from negative number = expected as NaN
if( !(result == result) ) printf("row=12 result= %17lf \r\n",result);
if( result == result ) printf("row=13 result= %17lf \r\n",result);
result = val3/val4; // 0.0/0.0 = expected as NaN
if( !(result == result) ) printf("row=16 result= %17lf \r\n",result);
if( result == result ) printf("row=17 result= %17lf \r\n",result);
result = (1.0/val3)/(1.0/val4); // +inf/+inf = expected as NaN
if( !(result == result) ) printf("row=20 result= %17lf \r\n",result);
if( result == result ) printf("row=21 result= %17lf \r\n",result);
result = (-1.0/val3) + (1.0/val4); // (-inf) + (+inf) = expected as NaN
if( !(result == result) ) printf("row=24 result= %17lf \r\n",result);
if( result == result ) printf("row=25 result= %17lf \r\n",result);
// Double-Precision Floating-Point Square-Root Reciprocal Approximation
result = _rsqrdp (val2); // _rsqrdp from negative number = expected as NaN
if( !(result == result) ) printf("row=29 result= %17lf \r\n",result);
if( result == result ) printf("row=30 result= %17lf \r\n",result);
printf("THE END ===================================== \r\n");
}
I have done four experiments:
1st case:
----------
volatile double val2=-0.182147, val3=0.0, val4=0.0;
volatile double result=3.3;
Optimization -> "empty"; Advanced Optimization -> "empty"
[C66xx_0] row=13 result= 0.000000
[C66xx_0] row=16 result= nan
[C66xx_0] row=20 result= nan
[C66xx_0] row=24 result= nan
[C66xx_0] row=29 result= nan
2nd case:
----------
volatile double val2=-0.182147, val3=0.0, val4=0.0;
volatile double result=3.3;
Optimization -> "2"; Advanced Optimization -> "2"
[C66xx_0] row=13 result= 0.000000
[C66xx_0] row=16 result= nan
[C66xx_0] row=20 result= nan
[C66xx_0] row=24 result= nan
[C66xx_0] row=29 result= nan
In 1st and 2nd cases all work as expected, except sqrt() which do not return NaN from negative argument.
3rd case:
----------
double val2=-0.182147, val3=0.0, val4=0.0;
double result=3.3;
Optimization -> "empty"; Advanced Optimization -> "empty"
[C66xx_0] row=13 result= 0.000000
[C66xx_0] row=16 result= nan
[C66xx_0] row=20 result= nan
[C66xx_0] row=24 result= nan
[C66xx_0] row=29 result= nan
In 3rd case
all work as expected (except sqrt() which always do not return NaN from negative argument)
4th case:
----------
double val2=-0.182147, val3=0.0, val4=0.0;
double result=3.3;
Optimization -> "2"; Advanced Optimization -> "2"
[C66xx_0] row=13 result= 0.000000
[C66xx_0] row=17 result= nan
[C66xx_0] row=21 result= 1.000000
[C66xx_0] row=25 result= nan
[C66xx_0] row=30 result= nan
In 4th case
division (+inf)/(+inf) returns 1.0 instead of NaN (may be Optimization cansels 0s in the fraction),
but
I have got more strange results here:
division (0.0)/(0.0) returns NaN, but NaN==NaN (row17) that contradicts with the NaN definition;
sum (-inf) + (+inf) returns NaN, but NaN==NaN (row25) that contradicts with the NaN definition;
function _rsqrdp() returns NaN, but NaN==NaN (row30) that contradicts with the NaN definition.
Please answer on two questions:
1) why do function sqrt() from negative argument do not return NaN ?
2) why do NaN==NaN in 4th case ?
I used:
Code Composer Studio 5.2.1.00018
Compiler version 7.4.7
mcsdk_2_01_02_06
MDSEVM6678L/MDXEVMPCI boards
Best regards.