Мне нужно написать такую функцию, как double_to_int(double val, int *err)
которая могла бы скрывать двойной val до целого числа, когда это возможно; в противном случае сообщите об ошибке (NAN/INFs/OUT_OF_RANGE).
поэтому реализация псевдокода будет выглядеть так:
if isnan(val):
err = ERR_NAN
return 0
if val < MAX_INT:
err = ERR_MINUS_INF
return MIN_INT
if ...
return (int)val
На SO есть как минимум два похожих вопроса: в этом ответе он решался достаточно чистым способом, хотя это решение C++ - в C у нас нет переносных цифр для подписанного int. В этом ответе он объяснил, почему мы не можем просто проверить (val > INT_MAX || val < INT_MIN)
.
Поэтому единственный возможный чистый способ, который я вижу, - использовать среду с плавающей запятой, но она указана как функция, определяемая реализацией.
Поэтому мой вопрос: есть ли способ реализовать функцию double_to_int
кросс-платформенным способом (основываясь только на стандарте C, даже не рассматривая целевые платформы для поддержки IEEE-754).