2012-08-08 5 views
3

이전에 게시 한 문제를 디버그하려고합니다 : C++ and pin tool -- very weird DOUBLE variable issue with IF statement. gdb를 사용하여 이상한 동작이 발생한 순간을 추적했습니다. 아래 그림은 디스 어셈블 된 코드와 부동 포인터 레지스터 값을 표시하는 gdb 스크린 샷을 보여줍니다. (큰 이미지 here) before and after FLDZ instruction is executed 왼쪽 이미지는 강조 표시된 FLDZ 명령이 실행되기 전에 스크린 샷을 표시하고 오른쪽 이미지는 명령 실행 후입니다. 나는 x86 ISA를 찾고 FLDZ+0.0ST(0)에로드하는 것입니다. 그러나 내가 얻는 것은 +0.0 대신 -nan입니다. 왜 이런 일이 발생하는지 알고 있습니까? 내가 사용하는 시스템은 64 비트 CentOS를 실행하는 Intel xeon 5645이지만 디버그하려는 대상 프로그램은 32 비트 응용 프로그램입니다. 또한 이전 포스트에서 언급했듯이, gcc의 두 버전, 4.2.4 및 4.1.2를 시도하고 같은 문제를 관찰했습니다. 감사합니다. .부동 소수점 명령 이상 - FLDZ 오작동?

--added-- 그런데 아래는 소스 코드입니다.

void Router::Evaluate() 
{ 
    if (_id == 0) aaa++; 

    if (_partial_internal_cycles != 0) 
    { 
    aaa += 12345; 
    cout << "this is not a zero : " << endl; 
    on = true; 
    } 

    _partial_internal_cycles += (double) 1.0; 

    if (_partial_internal_cycles >= (double)1.0) { 
    _InternalStep(); 
    _partial_internal_cycles -= (double)1.0; 
    } 

    if (GetSimTime() > 8646000 && _id == 0) cout << "aaa = " << aaa << endl; 
    if (on) 
    { 
    cout << "break. id = " << _id << endl; 
    assert(false); 
    } 

} 
+0

FPU 스택 오버 플로우처럼 보입니다. 현재 소스 코드가 있습니까? –

+0

'if (_partial_internal_cycles! = 0)'에서 오류가 발생하는 것처럼 보입니다. 그 시점에서 FPU 스택이 가득 찼습니다. 어떻게 될 수 있는지 이해해야합니다. 필자가 잘 알고있는 컴파일러는 계산이 끝나면 FPU 스택을 비 웁니다. 어떤 컴파일러를 사용하고 있습니까? –

+0

나는 어디에서 오류가 발생했는지 동의한다. 또한 gcc 4.2.4를 사용했습니다. – ray

답변

3

예외가 (차리는 I 비트가 stat 필드에 설정 됨)를 생성 하였다. the documentation이 말하기를 :

을 새로운 ST 될 것 같다 (7) 데이터 레지스터 (0) 스택 오류 및 잘못된 연산 예외 모두 말씀 상태에서 두 플래그를 설정, 감지, 비어 있지 않은 경우 . 상태 워드의 TOP 레지스터 포인터는 여전히 감소되고 ST (0)의 새 값은 확정 된 NAN이됩니다.

그런데 근본적인 문제는 부동 소수점의 성격이기 때문입니다. 정확한 것은 아닙니다. 예를 들어, this gcc bug report - 및 this one을 참조하십시오.

+0

"그건 그렇고, 근본적인 문제는 이것이 부동 소수점의 본질이기 때문입니다. 정확한." 그것은 사실이지만 다른 질문과 관련이 없습니다. –

+0

입니다. 비교 결과는 정밀도에 따라 다릅니다. –

+0

'x == 0'은'x'가 변경되지 않는 한 평가 될 때마다 같은 값을 반환합니다. 부동 소수점 산술은 실제로 부정확하지만 그 질문에는 산술 연산이 없습니다. –