В C, при реализации с поплавками IEEE-754, когда я сравниваю два числа с плавающей запятой, которые являются NaN, он возвращает 0 или «false». Но почему два числа с плавающей запятой, которые оба являются равными?C IEEE-Floats inf равно inf
В этой программе печатается «equal: ...» (по крайней мере, под Linux AMD64 с gcc), и, на мой взгляд, она должна печатать «разные: ...».
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
volatile double a = 1e200; //use volatile to suppress compiler warnings
volatile double b = 3e200;
volatile double c = 1e200;
double resA = a * c; //resA and resB should by inf
double resB = b * c;
if (resA == resB)
{
printf("equal: %e * %e = %e = %e = %e * %e\n",a,c,resA,resB,b,c);
}
else
{
printf("different: %e * %e = %e != %e = %e * %e\n", a, c, resA, resB, b, c);
}
return EXIT_SUCCESS;
}
Другой пример, почему я думаю, что инф не то же самое, как инф, является: число натуральных чисел и рациональных чисел, как бесконечны, но не то же самое.
Итак, почему inf == inf?
Рассмотрите этот код, безусловно, не сравните 2 'double', которые оба являются' бесконечность'. Этот код сравнивает результаты двух операций для равенства. C позволяет выполнять промежуточные вычисления с использованием более широкого типа. В этом случае я ожидал бы, что 'a * c == b * c' будет ложным. Более прямой пример кода будет использовать объекты 'volatile double', которые являются бесконечными, а затем сравнивают их. – chux
@chux Спасибо, я редактирую исходный код – 12431234123412341234123