File indexing completed on 2026-04-09 07:49:18
0001
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
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 ;
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
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
0113 check_inf();
0114 return 0 ;
0115 }