Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:18

0001 // name=signbitTest ; gcc $name.cc -std=c++11 -lstdc++ -o /tmp/$name && /tmp/$name
0002 
0003 #include <vector>
0004 #include <cmath>
0005 #include <cstdio>
0006 #include <cassert>
0007 
0008 
0009 
0010 void check_nan()
0011 {
0012     unsigned n = 8 ; 
0013     float* pairs = new float[n*2]  
0014     {  
0015         1.f,  1.f,
0016        -1.f,  1.f, 
0017         1.f,  0.f, 
0018        -1.f,  0.f, 
0019         0.f,  0.f, 
0020        -0.f,  0.f, 
0021         0.f, -0.f,
0022        -0.f, -0.f 
0023     }; 
0024 
0025     for(unsigned i=0 ; i < n ; i++ )
0026     {
0027         float num = pairs[2*i+0] ; 
0028         float den = pairs[2*i+1] ; 
0029         float rat = num/den ; 
0030         bool  neg = signbit(rat); 
0031 
0032         float nrat = -rat ; 
0033         float rat0 = rat + 0.f ; 
0034         float rat2 = rat*2.f ; 
0035         // all expressions with nan yield nan
0036 
0037         bool gt_0 = rat > 0.f ; 
0038         bool ge_0 = rat >= 0.f ; 
0039         bool lt_0 = rat < 0.f ; 
0040         bool le_0 = rat <= 0.f ; 
0041         bool eq_0 = rat == 0.f ; 
0042         bool or_expr_0 = num < 100.f || rat > 0.f ;   // the nan always false does NOT spread to short circuit OR result 
0043         bool or_expr_1 = rat > 0.f || num < 100.f ;  
0044         bool or_expr_2 = rat > 0.f || num > 100.f ;  
0045 
0046 
0047         printf("//signbitTest  i %d num %10.4f den %10.4f rat %10.4f signbit %d  -rat %10.4f  rat+0.f %10.4f rat*2.f %10.4f ", i, num, den, rat, neg, nrat, rat0, rat2 ); 
0048         printf(" gt_0 %d ge_0 %d lt_0 %d le_0 %d eq_0 %d or_expr_0 %d or_expr_1 %d or_expr_2 %d  \n", gt_0, ge_0, lt_0, le_0, eq_0, or_expr_0, or_expr_1, or_expr_2 ); 
0049 
0050         if(std::isnan(rat))    
0051         {
0052             //printf("//isnan : all comparisons with nan return false \n"); 
0053             assert( gt_0 == false ); 
0054             assert( ge_0 == false ); 
0055             assert( lt_0 == false ); 
0056             assert( le_0 == false ); 
0057             assert( eq_0 == false ); 
0058         }
0059 
0060     } 
0061 }
0062 
0063 
0064 void check_inf()
0065 {
0066     float inf = 1.f/0.f ; 
0067     float ninf = -inf; 
0068 
0069     float inf_times_zero = inf*0.f ; 
0070     float inf_plus_zero = inf+0.f ; 
0071     float inf_times_one = inf*1.f ; 
0072     float inf_plus_one = inf+1.f ; 
0073 
0074     float ninf_times_zero = ninf*0.f ; 
0075     float ninf_plus_zero = ninf+0.f ; 
0076     float ninf_times_one = ninf*1.f ; 
0077     float ninf_plus_one = ninf+1.f ; 
0078 
0079     float ninf_times_minus_one = ninf*-1.f ; 
0080 
0081 
0082     printf("// inf      %10.4f \n", inf ); 
0083     printf("// ninf     %10.4f \n", ninf ); 
0084 
0085     printf("// inf_times_zero %10.4f \n", inf_times_zero ); 
0086     printf("// inf_plus_zero %10.4f \n",  inf_plus_zero ); 
0087     printf("// inf_times_one %10.4f \n", inf_times_one ); 
0088     printf("// inf_plus_one %10.4f \n",  inf_plus_one ); 
0089 
0090     assert( std::isnan(inf_times_zero) ); 
0091     assert( std::isinf(inf_plus_zero) ); 
0092     assert( std::isinf(inf_times_one) ); 
0093     assert( std::isinf(inf_plus_one) ); 
0094 
0095     printf("// ninf_times_zero %10.4f \n", ninf_times_zero ); 
0096     printf("// ninf_times_minus_one %10.4f \n", ninf_times_minus_one ); 
0097     printf("// ninf_plus_zero %10.4f \n",  ninf_plus_zero ); 
0098     printf("// ninf_times_one %10.4f \n", ninf_times_one ); 
0099     printf("// ninf_plus_one %10.4f \n",  ninf_plus_one ); 
0100 
0101     assert( std::isnan(ninf_times_zero) ); 
0102     assert( std::isinf(ninf_plus_zero) ); 
0103     assert( std::isinf(ninf_times_one) ); 
0104     assert( std::isinf(ninf_plus_one) ); 
0105 }
0106 
0107 
0108 
0109 
0110 int main(int argc, char** argv)
0111 {
0112     // check_nan(); 
0113     check_inf(); 
0114     return 0 ; 
0115 }