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.0e-318 실제로'IS' 9.99999e-319 – GreenScape
@GreenScape : 문제는 정상적인 복식이 ~ 2.2e-308까지만 내려가는 것과 모든 다른 결과가 ~ 4.9e- 324. 많은 프로그램이 비정규 화 된 수레를 이해하지 못합니다. – PlasmaHH