Я работаю над большим проектом, в котором в качестве значения null
используется NaN. Я не совсем доволен этим - по тем же причинам, что и вы: не зная, что может пойти не так. Пока мы не сталкивались с какими-либо реальными проблемами, но имейте в виду следующее:
NaN-арифметика - Хотя "промо-акция NaN" в большинстве случаев полезна, она не всегда соответствует ожиданиям.
Сравнение - Сравнение значений становится довольно дорогим, если вы хотите, чтобы значения NaN сравнивались одинаково. Теперь проверить поплавки на равенство в любом случае непросто, но порядок (a
Заражение кода - Я вижу много арифметического кода, который требует правильной обработки NaN. Таким образом, в результате вы получаете «функции, которые принимают NaN» и «функции, которые не принимают» по соображениям производительности.
Другие неконечные NaN - единственное неконечное значение. Следует иметь в виду ...
Исключения с плавающей точкой не являются проблемой при отключении. Пока кто-то не позволяет им. Правдивая история: Статическая инициализация NaN в элементе управления ActiveX. Звучит не страшно, пока вы не измените установку на использование InnoSetup, в котором используется ядро Pascal / Delphi (?), Для которого по умолчанию включены исключения FPU. Мне понадобилось время, чтобы понять.
Так что, в общем, ничего серьезного, хотя я бы предпочел не рассматривать NaN так часто.
Я бы использовал типы Nullable как можно чаще, если только они (как доказано) не являются ограничениями производительности / ресурсов. Один случай может быть большими векторами / матрицами со случайными NaN или большими наборами именованных отдельных значений , где поведение NaN по умолчанию является правильным .
В качестве альтернативы, вы можете использовать индексный вектор для векторов и матриц, стандартных реализаций "разреженной матрицы" или отдельного вектора bool / bit.