최소 2배 값(C/C++)
C(++) 프로그램에서 가장 작은 음수 값(예를 들어 음수 무한대 사용)을 나타내는 표준 및/또는 휴대용 방법이 있습니까?
float.h의 DBL_MIN은 최소 양수입니다.
-DBL_MAX
float.h에 정의되어 있는 ANSI C의 경우.
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();
IEE IEEE 754)을 수 있는 DBL_MAX
또는 )는 마이너스 기호만 붙입니다.
그리고 멋진 방법이 있습니다.
double f;
(*((uint64_t*)&f))= ~(1LL<<52);
실제 무한대를 원하십니까, 아니면 최소 유한값을 원하십니까?전자의 경우 다음을 사용합니다.
-numeric_limits<double>::infinity()
이 방법은
numeric_limits<double>::has_infinity
그렇지 않으면
numeric_limits<double>::lowest()
C++11에서 도입되었습니다.
iflowest()
수 . 다시 할 수 .로 폴백할 수 있습니다.
-numeric_limits<double>::max()
는 다를 수 lowest()
원칙적으로는 그렇지만 실제로는 그렇지 않아요
진정한 휴대용 C++ 솔루션
C++11부터는 를 사용할 수 있습니다.표준에 따라 원하는 것을 정확히 반환합니다.
x. 여기서 른가가가 y가가 x.
y < x
에서 의미가 있습니다.is_bounded != false
.
여기에는 휴대용이 아닌 C++ 답변이 많이 있습니다!
많은 답이 나오고 있어요.-std::numeric_limits<double>::max()
.
다행히 대부분의 경우 잘 작동될 것입니다.부동소수점 부호화 스킴은 가수와 지수의 숫자를 분해하고, 그 대부분이 가수에 속하지 않는 별개의 부호 비트를 사용한다.이렇게 하면 부호를 뒤집는 것만으로 가장 작은 음수에서 가장 큰 양수를 변환할 수 있습니다.
이것들은 왜 휴대할 수 없는 거죠?
이 규격은 부동소수점 기준을 부과하지 않습니다.
내 주장이 다소 이론적이라는 것에 동의하지만, 일부 엑센트릭 컴파일러 제작자가 2의 보수의 변형으로 부호화된 가수와 함께 혁명적인 부호화 방식을 사용한다고 가정해 보자.두 개의 보완 부호화는 대칭이 아닙니다.예를 들어 부호 있는 8비트 char의 경우 최대 양수는 127이지만 최소 음수는 -128입니다.따라서 부동소수점 부호화에 따라서는 유사한 비대칭 동작이 나타날 수 있습니다.
그런 부호화 방식은 잘 모르지만, 요점은 부호 플립이 의도한 결과를 낳는다는 것을 표준이 보장하지 않는다는 것입니다.따라서 이 일반적인 답변(죄송합니다!)은 완전히 휴대 가능한 표준 솔루션으로 간주할 수 없습니다. /* 적어도 다음과 같이 단언하지 않았다면요.numeric_limits<double>::is_iec559
맞는 말이야 */
이것을 시험해 보세요.
-1 * numeric_limits<double>::max()
레퍼런스:
이 클래스는 각 기본 유형에 특화되어 있으며 구성원은 컴파일하는 특정 플랫폼에서 해당 유형의 속성을 정의하는 다른 값으로 반환되거나 설정됩니다.
C(++) 프로그램에서 가장 작은 음수 값(예를 들어 음수 무한대 사용)을 나타내는 표준 및/또는 휴대용 방법이 있습니까?
C접근법
많은 구현이 +/- 무한대를 지원하므로 가장 부정적인 구현double
값은-INFINITY
.
#include <math.h>
double most_negative = -INFINITY;
표준 및/또는 휴대용 방법이 있습니까?
이제 다른 사례도 고려해야 합니다.
- 무한대 없음
간단하게-DBL_MAX
.
- 부호 없는 무한대일 뿐이지
이런 경우 OP가 더 좋아하겠군-DBL_MAX
.
- 다음 크기보다 큰 비정규 값
DBL_MAX
.
이는 OP의 관심 밖일 가능성이 높은 이례적인 경우입니다.언제double
원하는 범위/세차를 달성하기 위해 부동소수점 쌍으로 인코딩됩니다(더블-더블 참조). 최대 법선이 존재합니다. double
어쩌면 더 큰 비정상일 수도 있어요나는 토론하는 것을 본 적이 있다DBL_MAX
둘 중 가장 큰 정상인 것을 가리켜야 합니다.
다행히도 이 쌍체 접근법은 보통 -infinity를 포함하므로, 가장 부정적인 값은 남아 있다.-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;
플로트 예외를 유효하게 하고 있지 않은 경우는, 간단하게 다음과 같이 말할 수 있습니다.
double neg_inf = -1/0.0;
이것은 음의 무한대를 산출합니다.플로트가 필요한 경우 결과를 캐스팅할 수 있습니다.
float neg_inf = (float)-1/0.0;
또는 단정도 산술을 사용하여
float neg_inf = -1.0f/0.0f;
결과는 항상 동일하며, 단정도 및 이중정도 모두에서 음의 무한대를 정확히 한 개씩 나타내며, 예상대로 서로 변환됩니다.
- std::numeric_limits<double>::max()
잘 될 것이다
원래 질문은 무한에 관한 것이다.그럼 왜 안 써?
#define Infinity ((double)(42 / 0.0))
IEEE 정의에 따라?당신은 물론 그것을 부정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1153548/minimum-double-value-in-c-c
'programing' 카테고리의 다른 글
Vuex 4 및 Vue 3에서 'mapActions' 또는 'mapGetters'를 사용합니다. (0) | 2022.08.15 |
---|---|
Mocha를 사용한 Vuejs 테스트: 컴포넌트가 요소에 장착되지 않음 (0) | 2022.08.15 |
Java에서 타이머를 설정하는 방법 (0) | 2022.08.15 |
Vuex getter 반환이 정의되지 않음 (0) | 2022.08.15 |
Maven – 항상 소스 및 자바독 다운로드 (0) | 2022.08.15 |