C (++) 프로그램에서 가장 작은 음수 값 (예 : 음의 무한대 사용)을 나타내는 표준 및 / 또는 이식 가능한 방법이 있습니까?
float.h의 DBL_MIN은 가장 작은 양수 입니다.
C (++) 프로그램에서 가장 작은 음수 값 (예 : 음의 무한대 사용)을 나타내는 표준 및 / 또는 이식 가능한 방법이 있습니까?
float.h의 DBL_MIN은 가장 작은 양수 입니다.
답변:
-DBL_MAX float.h에 정의 된 ANSI C 에서.
-DBL_MAX정확하게 표현할 수 있어야 하므로 FP 하드웨어가이를 수행 할 수없는 경우 구현에서이를 해결해야합니다. 5.2.4.2.2 C99 의 부동 유형 <float.h> p2 의 특성에서 부동 소수점 모델을 참조하십시오 (그 이후로 다른 곳으로 이동되었을 수 있음).
부동 소수점 숫자 (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();
min()C ++ 11 이전 에는이 기능을 사용할 수 없었습니까 ? 아니면 다른 값 -max()입니까? en.cppreference.com/w/cpp/types/numeric_limits
min을 보면 가장 작은 양의 값과 lowest가장 큰 음의 값 을 얻을 수 있습니다 . 예, 끔찍합니다. C ++ 표준 라이브러리의 화려한 세계에 오신 것을 환영합니다 :-P.
float.h. limits.h정수를위한 것입니다
이 시도:
-1 * numeric_limits<double>::max()
참고: numeric_limits
이 클래스는 각 기본 유형에 특화되어 있으며 해당 멤버는 컴파일되는 특정 플랫폼에서 유형이 갖는 속성을 정의하는 다른 값으로 반환되거나 설정됩니다.
-numeric_limits<double>::max()?
-1 * ...좀 더 명확하게 만드는 데 사용 합니다.
실제 무한대 또는 최소 유한 값을 찾고 있습니까? 전자의 경우
-numeric_limits<double>::infinity()
다음 경우에만 작동합니다.
numeric_limits<double>::has_infinity
그렇지 않으면
numeric_limits<double>::lowest()
C ++ 11에서 소개되었습니다.
lowest()사용할 수없는 경우 다음 으로 돌아갈 수 있습니다.
-numeric_limits<double>::max()
lowest()원칙적으로 는 다를 수 있지만 실제로는 그렇지 않습니다.
-numeric_limits<double>::max()실제로 작동하더라도 이론적으로 완전히 이식 할 수는 없습니다.
C ++ 11에서와 같이 numeric_limits<double>::lowest(). 표준에 따르면 원하는 것을 정확하게 반환합니다.
다른 유한 값 y가없는 유한 값 x
y < x. 여기서 .
모든 전문 분야에서 의미가is_bounded != false있습니다.
에 대한 많은 답변이 있습니다 -std::numeric_limits<double>::max().
다행히도 대부분의 경우 잘 작동합니다. 부동 소수점 인코딩 체계는 가수와 지수의 숫자를 분해하며 대부분 (예 : 인기있는 IEEE-754 )은 가수에 속하지 않는 고유 한 부호 비트를 사용합니다. 이렇게하면 부호를 뒤집어 가장 작은 음수에서 가장 큰 양수를 변환 할 수 있습니다.
표준은 부동 소수점 표준을 부과하지 않습니다.
나는 내 주장이 약간 이론적이라는 데 동의하지만, 일부 특이한 컴파일러 제작자가 2의 보수의 일부 변형으로 인코딩 된 가수가있는 혁신적인 인코딩 체계를 사용한다고 가정합니다. . 2의 보수 인코딩은 대칭이 아닙니다. 예를 들어 부호있는 8 비트 문자의 경우 최대 양수는 127이지만 최소 음수는 -128입니다. 따라서 일부 부동 소수점 인코딩이 유사한 비대칭 동작을 표시한다고 상상할 수 있습니다.
나는 그런 인코딩 체계를 알지 못하지만, 요점은 표준이 부호 반전이 의도 한 결과를 산출한다고 보장하지 않는다는 것 입니다. 따라서이 인기있는 답변 (죄송합니다!)은 완전히 이식 가능한 표준 솔루션으로 간주 될 수 없습니다! / * 적어도 그것이 numeric_limits<double>::is_iec559사실 이라고 주장하지 않았다면 * /
C (++) 프로그램에서 가장 작은 음수 값 (예 : 음의 무한대 사용)을 나타내는 표준 및 / 또는 이식 가능한 방법이 있습니까?
C 접근.
많은 구현에서 +/- 무한대를 지원하므로 가장 부정적인 double값은 -INFINITY.
#include <math.h>
double most_negative = -INFINITY;
표준 및 / 또는 휴대용 방법이 있습니까 ....?
이제 다른 경우도 고려해야합니다.
간단히 -DBL_MAX.
이 경우 OP는 -DBL_MAX.
DBL_MAX.이것은 OP의 우려를 벗어난 비정상적인 경우입니다. 경우 double(A)의 쌍으로 인코딩 된 부동 소수점 원하는 범위 / 세차 운동을 달성하기 위해, (참조 : 이중 이중 최대 존재) 정상 double 아마도 더 드 통상 하나. 나는 DBL_MAX가장 큰 정상을 언급해야하는지 논쟁을 보았다. 둘 중 가장 .
다행히이 쌍을 이루는 접근 방식은 일반적으로-무한대를 포함하므로 가장 음의 값이 남아 있습니다 -INFINITY.
더 많은 이식성을 위해 코드는 경로를 따라갈 수 있습니다.
// HUGE_VAL is designed to be infinity or DBL_MAX (when infinites are not implemented)
// .. yet is problematic with unsigned infinity.
double most_negative1 = -HUGE_VAL;
// Fairly portable, unless system does not understand "INF"
double most_negative2 = strtod("-INF", (char **) NULL);
// Pragmatic
double most_negative3 = strtod("-1.0e999999999", (char **) NULL);
// Somewhat time-consuming
double most_negative4 = pow(-DBL_MAX, 0xFFFF /* odd value */);
// My suggestion
double most_negative5 = (-DBL_MAX)*DBL_MAX;
부동 예외를 활성화하지 않은 경우 (imho해서는 안 됨) 간단히 다음과 같이 말할 수 있습니다.
double neg_inf = -1/0.0;
이것은 음의 무한대를 산출합니다. 플로트가 필요한 경우 결과를 캐스팅 할 수 있습니다.
float neg_inf = (float)-1/0.0;
또는 단 정밀도 산술 사용
float neg_inf = -1.0f/0.0f;
결과는 항상 동일하며 단 정밀도와 배정 밀도 모두에서 음의 무한대를 정확히 하나만 표현하며 예상대로 서로 변환됩니다.
-INFINITY
neg_inf 초기화되는 것을 알 수 있습니다 . 컴파일러는 inf값 계산을 처리합니다 . 그리고 최대 값을 계산하기 위해 null 값으로 사용하면 일반적으로 첫 번째 반복이 더 큰 값으로 덮어 씁니다. 즉 성능은 거의 문제가되지 않습니다. 그리고 OP는 "예를 들어 음의 무한대를 사용하는 것"에 대해 구체적으로 묻고 -inf실제로 이것에 대한 유일한 정답입니다. 정확하고 유용한 답변에 반대표를 던졌습니다.