По-настоящему портативное решение C ++
Начиная с C ++ 11 вы можете использовать numeric_limits<double>::lowest()
.
Согласно стандарту, он возвращает именно то, что вы ищете:
Конечное значение x такое, что нет другого конечного значения y, где y < x
.
Имеет значение для всех специализаций, в которых is_bounded != false
.
Демо онлайн
Множество непереносимых ответов C ++ здесь!
Есть много ответов для -std::numeric_limits<double>::max()
.
К счастью, они будут хорошо работать в большинстве случаев. Схемы кодирования с плавающей запятой разлагают число в мантиссе и показателе степени, и большинство из них (например, популярный IEEE-754 ) используют отдельный знаковый бит, который не принадлежит мантиссе. Это позволяет преобразовать самый большой положительный в самый маленький отрицательный, просто щелкнув по знаку:
Почему они не портативны?
Стандарт не навязывает стандарт с плавающей запятой.
Я согласен, что мой аргумент немного теоретический, но предположим, что некоторые эксцентричные производители компиляторов будут использовать революционную схему кодирования с мантиссой, закодированной в некоторых вариациях дополнения до двух . Кодирование дополнения двух не симметрично например, для 8-разрядного знака со знаком максимальное положительное значение равно 127, а минимальное отрицательное значение равно -128. Таким образом, мы могли бы представить, что некоторое кодирование с плавающей запятой демонстрирует похожее асимметричное поведение.
Я не знаю ни одной подобной схемы кодирования, но дело в том, что стандарт не гарантирует, что переворачивание знака даст ожидаемый результат . Так что этот популярный ответ (извините, ребята!) Нельзя рассматривать как полностью переносимое стандартное решение! / * по крайней мере, если вы не утверждали, что numeric_limits<double>::is_iec559
верно * /