4

ParaView에서 처리/시각화하기 위해 C++ 프로그램에서 일부 데이터를 인쇄하고 있지만 부동 소수점에 문제가 있습니다. Paraview는 Float32 및 Float64 데이터 유형을 모두 지원합니다. Float64는 일반적인 제한 인 +/- 1.7e +/- 308을 사용하는 double과 같습니다. 그러나 내 코드는 6.5e-318과 같은 숫자를 인쇄합니다. 데이터를 읽을 때 ParaView에서 오류가 발생합니다. 작은 숫자를 0으로 반올림하면 ParaView의 오류가 사라지는 것을 확인했습니다. 내가 왜 그런 "고정밀"출력을 가지고 있는지 모르겠다. 어쩌면 어떤 숫자가 double보다 더 높은 정밀도로 저장되기 때문일 것이다.출력 정밀도가 배정도보다 높음

#include <iostream> 
int main(void) 
{ 
    const double var1 = 1.0e-318, var2 = 1.5e-318; 
    std::cout << 1.0e-318 << std::endl; 
    std::cout << var1 << std::endl; 
    std::cout << var1 - var2 << std::endl; 
    std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield); 
    std::cout << 1.0e-318 << std::endl; 
    std::cout << var1 << std::endl; 
    std::cout << var1 - var2 << std::endl; 

    return 0; 
} 

내 출력은 다음과 같습니다 : 예를 들어, 다음 코드는 내 시스템에 동일한 동작을 재현

9.99999e-319 
9.99999e-319 
-4.99999e-319 
9.99999e-319 
9.99999e-319 
-4.99999e-319 

내 시스템은 맥 OS X 스노우 레오파드 (Snow Leopard) 내가 GCC 4.2과 함께 위의 테스트 GCC 4.6 플래그가 -m32, -m64-ffloat-store 인 경우 유용합니다 (확실하지 않은 경우).

실제로 나를위한 출력은 괜찮지 만 ParaView는 그렇지 않습니다. 나는 왜 나는이 차이가 있는지 알고 싶다. 나는 매우 중요한 부동 소수점 숫자와 관련된 것을 무시할 가능성이 높습니다. 제발이 출력에 대한 단서를 주 시겠어요/복식에 대한 수치 적 행동?

+1

정확하게 여기에 문제가 있습니까? 전과 후의 차이는 없습니다. 1.0e-318 실제로'IS' 9.99999e-319 – GreenScape

+0

@GreenScape : 문제는 정상적인 복식이 ~ 2.2e-308까지만 내려가는 것과 모든 다른 결과가 ~ 4.9e- 324. 많은 프로그램이 비정규 화 된 수레를 이해하지 못합니다. – PlasmaHH

답변

11

비정규 숫자, 즉 가능한 가장 작은 지수 및 소수점 앞에 0이있는 숫자, can be smaller than 1E-308, down to 1E-324. std :: numeric_limits를 사용하여 필터링 할 수 있습니다.

+0

예, 실제 이중 최소값과 현재 값을 비교하여 해결할 수 있다고 생각합니다. subnormals 번호에 대한 정보를 지적 주셔서 감사합니다. – iluvatar