Я хочу сделать простой макрос с #define для возврата меньшего из двух чисел.
Я хотел добавить решение, когда числа равны с плавающей точкой .
Рассмотрим, когда числа являются числами с плавающей запятой, и одним из чисел является not-a-number . Тогда результат a < b
всегда равен false
независимо от значения другого числа.
// the result is `b` when either a or b is NaN
#define min(a, b) (((a) < (b)) ? (a) : (b))
Может быть желательно, чтобы результат был таким, как показано ниже, где «аргументы NaN обрабатываются как отсутствующие данные». С11 Сноска № 242
a NaN | b NaN | a < b | min
-------+---------+---------+---------------
No | No | No | b
No | No | Yes | a
No | Yes | . | a
Yes | No | . | b
Yes | Yes | . | either a or b
Чтобы сделать это с макросом в C, просто оберните функцию fmin()
, которая поддерживает приведенную выше таблицу. Конечно, код должен обычно использовать функцию fmin()
напрямую.
#include <math.h>
#define my_fmin(a, b) (fmin((a), (b))
Обратите внимание, что fmin(0.0, -0.0)
может вернуть 0.0
или -0.0
. Они оба имеют равное значение .