Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #121004

Re: Interesting results

From Michael S <already5chosen@yahoo.com>
Newsgroups comp.lang.c++
Subject Re: Interesting results
Date 2024-11-25 01:04 +0200
Organization A noiseless patient Spider
Message-ID <20241125010452.00006c08@yahoo.com> (permalink)
References <vhvk6i$2a5nc$1@raubtier-asyl.eternal-september.org>

Show all headers | View raw


On Sun, 24 Nov 2024 17:29:00 +0100
Bonita Montero <Bonita.Montero@gmail.com> wrote:

> This code combines finite values with NaN-values and Inf-values and
> compares them with all basic comparison operators.
> 
> #include <iostream>
> #include <limits>
> 
> using namespace std;
> 
> int main()
> {
> 	constexpr double
> 		NaN = numeric_limits<double>::quiet_NaN(),
> 		Inf = numeric_limits<double>::infinity(),
> 		Finite = 1.0;
> 	static struct value_t
> 	{
> 		char const *what;
> 		double value;
> 	} const values[] =
> 	{
> 		{ "Finite", Finite },
> 		{ "Inf", Inf },
> 		{ "NaN", NaN }
> 	};
> 	static struct op_t
> 	{
> 		char const *what;
> 		bool (*op)( double, double );
> 	} const ops[] =
> 	{
> 		{ "<", +[]( double a, double b ) { return a < b; } },
> 		{ "<=", +[]( double a, double b ) { return a <= b; }
> }, { "==", +[]( double a, double b ) { return a == b; } },
> 		{ ">=", +[]( double a, double b ) { return a >= b; }
> }, { ">", +[]( double a, double b ) { return a > b; } }
> 	};
> 	for( value_t const &vA : values )
> 	{
> 		cout << vA.what << endl;
> 		for( value_t const &vB : values )
> 		{
> 			if( &vA == &vB && &vA == values )
> 				continue;
> 			cout << "\t" << vB.what << endl;
> 			for( op_t const &op : ops )
> 			{
> 				cout << "\t\t" << op.what << ": ";
> 				cout << (ops->op( vA.value, vB.value
> ) ? "true" : "false") << endl; }
> 		}
> 	}
> }
> 
> This are the results:
> 
> Finite
>          Inf
>                  <: true
>                  <=: true
>                  ==: true
>                  >=: true
>                  >: true  
>          NaN
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
> Inf
>          Finite
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
>          Inf
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
>          NaN
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
> NaN
>          Finite
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
>          Inf
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
>          NaN
>                  <: false
>                  <=: false
>                  ==: false
>                  >=: false
>                  >: false  
> 
> Interesting results !
> 

Nothing of interest here, except for another proof that combination of
borderline-sane programming language with insane programming style
causes bugs. 
Here is the same test written in more sane language and style. Results
are 100% as expected:

#include <stdio.h>
#include <math.h>

int main()
{
  static const double vals[3] = { 1.0, INFINITY, NAN };
  _Bool results[3][3][5];
  for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < 3; ++j) {
      results[i][j][0] = vals[i] <  vals[j];
      results[i][j][1] = vals[i] <= vals[j];
      results[i][j][2] = vals[i] == vals[j];
      results[i][j][3] = vals[i] >= vals[j];
      results[i][j][4] = vals[i] >  vals[j];
    }
  }

  static const char* ops[5] = { "<", "<=", "==", ">=", ">" };
  for (int i = 0; i < 3; ++i) {
    for (int k = 0; k < 5; ++k) {
      for (int j = 0; j < 3; ++j)
        printf(" %3g %2s %3g : %-5s ;",
          vals[i], ops[k], vals[j],
          results[i][j][k] ? "true" : "false");
      printf("\n");
    }
  }
  return 0;
}

Results:
   1  <   1 : false ;   1  < inf : true  ;   1  < nan : false ;
   1 <=   1 : true  ;   1 <= inf : true  ;   1 <= nan : false ;
   1 ==   1 : true  ;   1 == inf : false ;   1 == nan : false ;
   1 >=   1 : true  ;   1 >= inf : false ;   1 >= nan : false ;
   1  >   1 : false ;   1  > inf : false ;   1  > nan : false ;
 inf  <   1 : false ; inf  < inf : false ; inf  < nan : false ;
 inf <=   1 : false ; inf <= inf : true  ; inf <= nan : false ;
 inf ==   1 : false ; inf == inf : true  ; inf == nan : false ;
 inf >=   1 : true  ; inf >= inf : true  ; inf >= nan : false ;
 inf  >   1 : true  ; inf  > inf : false ; inf  > nan : false ;
 nan  <   1 : false ; nan  < inf : false ; nan  < nan : false ;
 nan <=   1 : false ; nan <= inf : false ; nan <= nan : false ;
 nan ==   1 : false ; nan == inf : false ; nan == nan : false ;
 nan >=   1 : false ; nan >= inf : false ; nan >= nan : false ;
 nan  >   1 : false ; nan  > inf : false ; nan  > nan : false ;





Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Interesting results Bonita Montero <Bonita.Montero@gmail.com> - 2024-11-24 17:29 +0100
  Re: Interesting results Paavo Helde <eesnimi@osa.pri.ee> - 2024-11-25 00:25 +0200
    Re: Interesting results Bonita Montero <Bonita.Montero@gmail.com> - 2024-11-25 06:32 +0100
  Re: Interesting results Michael S <already5chosen@yahoo.com> - 2024-11-25 01:04 +0200
    Re: Interesting results Bonita Montero <Bonita.Montero@gmail.com> - 2024-11-25 06:32 +0100
  Re: Interesting results wij <wyniijj5@gmail.com> - 2024-11-26 03:32 +0800
    Re: Interesting results wij <wyniijj5@gmail.com> - 2024-11-26 03:41 +0800

csiph-web