2012-02-15 2 views
1

Delphi XE2에서 System.Str로 변경되었습니다. 다음 절차 :Delphi XE2 - System.Str가 변경되었거나 손상 되었습니까?

procedure someProcedure; 
var 
    E:double; 
    outString:string; 
begin 
    E:=-1.7E+308; 
    Str(E:i:j, outString); 
end; 

는 (0x00407318에서 예외 클래스 $의 C0000005, 액세스 위반 : 주소 0x30303028의 읽기) 액세스 위반

를 발생시킵니다

'i'를 델파이 XE2에서

와 'J' 어떤 정수이든간에. 이 동일한 코드는 Delphi 2010에서 제대로 작동하고 outString = '-1.7E + 0308'을 반환합니다. 유사한 코드가 TurboPower Orpheus 구성 요소 중 일부에서 사용되며 전체 IDE가 BEX 오류로 인해 충돌합니다.

이것은 Win7 64 비트 버전입니다. 어떤 아이디어?

편집 : 추가 정보

큰 음수 일 때만 발생하는 것으로 보입니다. Str은 ~ 130자를 넘을 때 깨지는 긴 문자열을 생성하는 것으로 보입니다.

참고 : 폭을 사용하는 경우 (내가 어떤 폭 = 곳)이

procedure someProcedure; 
var 
    E:double; 
    outString:string; 
begin 
    E:=-1.7E+308; 
    Str(E:i, outString); 
end; 
+0

이것은 정밀도 오류가 아닙니다. 이것은 -1.6E117이 2 진 부동 소수점 형식으로 정확하게 표현할 수 없다는 것입니다. –

+0

해결 방법은 아마도 0보다 작은 지 테스트하고, 부호를 부정한 다음 문자열에 '-'접두사를 붙이는 것입니다. – CodesInChaos

+2

사실 XE2가 올바르게 작동하고 있습니다. '1.60000000000000002E + 0117'이 맞습니다. Rob Kennedy의 가장 유용한 페이지를 참조하십시오 : http://pages.cs.wisc.edu/~rkennedy/exact-float?number=-1.6e117 –

답변

7

휴식하지 않습니다 그것은 분명 큰 크기 음수의 처리 버그입니다. 양수는 잘 처리됩니다. Str에 대한 호출을 가로 챌 수 있다면 Str에 양수가 전달 된 다음 - 접두사 만 붙이면됩니다.

버그를 Quality Central : QC#103436에 제출했습니다.

+0

당신이 이것을 쓰면서 큰 음화에 대해 조금 더하고있었습니다. 또한 양수 값에도 영향을 미치는 정밀 오차가 있습니다. –

+3

@J ... 정밀도 오류가 없습니다. 번호는 정확하게 표현할 수 없습니다. –

+0

어쨌든 나는 잠시 시간을내어 품질 관리를 할 것이다. 해결 방법은 매우 분명하지만 처음부터 깨져서는 안되는 것으로 보입니다. –