On Sun, Mar 26, 2023 at 1:28 AM Tom Lane <[email protected]> wrote:
>
> I think you can take it as read that simple C test programs on modern
> platforms will exhibit IEEE-compliant handling of float infinities.
>
For the record, I tried the attached. It gives a warning at compilation time.
$gcc float_inf.c
float_inf.c: In function ‘main’:
float_inf.c:10:17: warning: division by zero [-Wdiv-by-zero]
10 | float inf = 1.0/0;
| ^
float_inf.c:11:20: warning: division by zero [-Wdiv-by-zero]
11 | float n_inf = -1.0/0;
| ^
$ ./a.out
inf = inf
-inf = -inf
inf + inf = inf
inf + -inf = -nan
-inf + inf = -nan
-inf + -inf = -inf
inf - inf = -nan
inf - -inf = inf
-inf - inf = -inf
-inf - -inf = -nan
float 0.0 equals 0.0
float 1.0 equals 1.0
5.0 * inf = inf
5.0 * - inf = -inf
5.0 / inf = 0.000000
5.0 / - inf = -0.000000
inf / 5.0 = inf
- inf / 5.0 = -inf
The changes in the patch are compliant with the observations above.
--
Best Wishes,
Ashutosh Bapat
#include <stdio.h>
void
test_flag(int flag, char *flag_name);
int
main(void)
{
float inf = 1.0/0;
float n_inf = -1.0/0;
printf("inf = %f\n", inf);
printf("-inf = %f\n", n_inf);
/* Additions */
printf("inf + inf = %f\n", inf + inf);
printf("inf + -inf = %f\n", inf + n_inf);
printf("-inf + inf = %f\n", n_inf + inf);
printf("-inf + -inf = %f\n", n_inf + n_inf);
/* Subtractions */
printf("inf - inf = %f\n", inf - inf);
printf("inf - -inf = %f\n", inf - n_inf);
printf("-inf - inf = %f\n", n_inf - inf);
printf("-inf - -inf = %f\n", n_inf - n_inf);
if (0.0 == 0.0)
printf("float 0.0 equals 0.0\n");
if (0.5 + 0.5 == .64 + .36)
printf("float 1.0 equals 1.0\n");
/* Multiplication */
printf(" 5.0 * inf = %f\n", 5.0 * inf);
printf(" 5.0 * - inf = %f\n", 5.0 * n_inf);
/* Division */
printf(" 5.0 / inf = %f\n", 5.0 / inf);
printf(" 5.0 / - inf = %f\n", 5.0 / n_inf);
printf(" inf / 5.0 = %f\n", inf / 5.0);
printf(" - inf / 5.0 = %f\n", n_inf / 5.0);
}