현재 부동 소수점 표현에 대해 자세히 배우려고 노력 중이므로 조금만 놀았습니다. 그렇게하는 동안 나는 이상한 행동을 발견했다. 무슨 일이 일어나고 있는지 정말 잘 모르겠습니다. 저는 통찰력에 대해 매우 감사 할 것입니다. 죄송합니다 답변이 있다면, 나는 구글에 꽤 어려워!캐스트 플롯을 0으로 비교할 때 이상한 동작이 발생했습니다.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
float minVal = pow(2,-149); // set to smallest float possible
float nextCheck = static_cast<float>(minVal/2.0f); // divide by two
bool isZero = (static_cast<float>(minVal/2.0f) == 0.0f); // this evaluates to false
bool isZero2 = (nextCheck == 0.0f); // this evaluates to true
cout << nextCheck << " " << isZero << " " << isZero2 << endl;
// this outputs 0 0 1
return 0;
}
은 본질적으로 어떤 일어나고있는 것은 :
- 내가 공을 양보해야 단 정밀도
- 나누 2로를 사용하여 표현 될 수있는 가장 작은 플로트로 MINVAL를 설정 - 우리는에있어 최소
- 실제로 isZero2는 true를 반환하지만 isZero는 false를 반환합니다.
무슨 일이 벌어지고있는 것입니까? 나는 그것들이 동일하다고 생각했을 것입니다. 컴파일러는 어떤 숫자를 나눌 경우 0이 될 수 없다고 말하는가?
도움 주셔서 감사합니다.
'pow (2, -149)'가 가능한 가장 작은 플로트를 반환하는지 어떻게 확인합니까? 계산 부정확성 문제가 많이 있습니다. – deepmax
작동하는 것 같습니다. 이진 표현은 실제로 가능한 가장 작은 float 인 1을 반환합니다. Sign = 0; 지수 = 0; Mantissa = 1이므로 2^(- 23) * 2^(- 126) = 2^(- 149) – noctilux
g ++ 4.8.2에서 예상되는 결과를 얻습니다. '0 1 1'. –