C / C ++의 최소 double 값 음수 값 (예 : 음의 무한대 사용)을

C (++) 프로그램에서 가장 작은 음수 값 (예 : 음의 무한대 사용)을 나타내는 표준 및 / 또는 이식 가능한 방법이 있습니까?

float.h의 DBL_MIN은 가장 작은 양수 입니다.



답변

-DBL_MAX float.h에 정의 된 ANSI C 에서.


답변

부동 소수점 숫자 (IEEE 754)는 대칭이므로 가장 큰 값 ( DBL_MAX또는 numeric_limits<double>::max())을 나타낼 수 있는 경우 마이너스 기호를 앞에 추가하면됩니다.

다음은 멋진 방법입니다.

double f;
(*((long long*)&f))= ~(1LL<<52);

답변

C에서는

#include <float.h>

const double lowest_double = -DBL_MAX;

C ++ pre-11에서는

#include <limits>

const double lowest_double = -std::numeric_limits<double>::max();

C ++ 11 이상에서는

#include <limits>

constexpr double lowest_double = std::numeric_limits<double>::lowest();

답변

이 시도:

-1 * numeric_limits<double>::max()

참고: numeric_limits

이 클래스는 각 기본 유형에 특화되어 있으며 해당 멤버는 컴파일되는 특정 플랫폼에서 유형이 갖는 속성을 정의하는 다른 값으로 반환되거나 설정됩니다.


답변

실제 무한대 또는 최소 유한 값을 찾고 있습니까? 전자의 경우

-numeric_limits<double>::infinity()

다음 경우에만 작동합니다.

numeric_limits<double>::has_infinity

그렇지 않으면

numeric_limits<double>::lowest()

C ++ 11에서 소개되었습니다.

lowest()사용할 수없는 경우 다음 으로 돌아갈 수 있습니다.

-numeric_limits<double>::max()

lowest()원칙적으로 는 다를 수 있지만 실제로는 그렇지 않습니다.


답변

진정으로 이식 가능한 C ++ 솔루션

C ++ 11에서와 같이 numeric_limits<double>::lowest(). 표준에 따르면 원하는 것을 정확하게 반환합니다.

다른 유한 값 y가없는 유한 값 x y < x. 여기서 .

모든 전문 분야에서 의미가 is_bounded != false있습니다.

온라인 데모


여기에 많은 이식 불가능한 C ++ 답변이 있습니다!

에 대한 많은 답변이 있습니다 -std::numeric_limits<double>::max().

다행히도 대부분의 경우 잘 작동합니다. 부동 소수점 인코딩 체계는 가수와 지수의 숫자를 분해하며 대부분 (예 : 인기있는 IEEE-754 )은 가수에 속하지 않는 고유 한 부호 비트를 사용합니다. 이렇게하면 부호를 뒤집어 가장 작은 음수에서 가장 큰 양수를 변환 할 수 있습니다.

왜 이것들은 휴대용이 아닌가?

표준은 부동 소수점 표준을 부과하지 않습니다.

나는 내 주장이 약간 이론적이라는 데 동의하지만, 일부 특이한 컴파일러 제작자가 2의 보수의 일부 변형으로 인코딩 된 가수가있는 혁신적인 인코딩 체계를 사용한다고 가정합니다. . 2의 보수 인코딩은 대칭이 아닙니다. 예를 들어 부호있는 8 비트 문자의 경우 최대 양수는 127이지만 최소 음수는 -128입니다. 따라서 일부 부동 소수점 인코딩이 유사한 비대칭 동작을 표시한다고 상상할 수 있습니다.

나는 그런 인코딩 체계를 알지 못하지만, 요점은 표준이 부호 반전이 의도 한 결과를 산출한다고 보장하지 않는다는 것 입니다. 따라서이 인기있는 답변 (죄송합니다!)은 완전히 이식 가능한 표준 솔루션으로 간주 될 수 없습니다! / * 적어도 그것이 numeric_limits<double>::is_iec559사실 이라고 주장하지 않았다면 * /