문제

내 클라이언트 응용 프로그램은 writeln 및 readln을 사용하여 텍스트 파일을 통해 real의 몇 가지 변수를 수출하고 가져옵니다. 코드가 다음과 같이 보이도록 작성된 필드의 너비를 늘리려 고 노력했습니다.

writeln(file, exportRealvalue:30); //using excess width of field
....
readln(file, importRealvalue);

수출 한 다음 다시 가져 와서 내보내기를 비교하고 파일을 비교할 때 마지막 두 자리에 차이가 나타납니다 (예 : 실제 숫자 수는 꺼져 있지만 얻을 수 있습니다).

-1.23456789012E-0002
-1.23456789034E-0002

이것은 실제로 앱에 차이를 만들어서 클라이언트가 내가 할 수있는 일을 알고 싶어합니다. 이제 나는 그것이 그것을하는 쓰기/읽기 만 확실하지 않지만 다시 Hey Stack에 뛰어 들기 전에 빠른 질문을 던질 것이라고 생각했습니다. 이것에 이진을 가야합니까?

이것은 통화 또는 무언가를 다루는 앱이 아니며 파일에 대한 값을 쓰고 읽습니다. 나는 부동 소수점이 약간 이상하다는 것을 알고 있으며, 루틴 중 하나 (Writeln/Readln) 중 하나가 재미있는 사업이 진행될 수 있다고 생각했습니다.

도움이 되었습니까?

해결책

Writeln과 함께 Real의 정밀도를 지정하려면 다음을 사용하십시오.

WriteLn(RealVar:12:3);

최소 12 개의 위치와 3의 정밀도로 Value RealVar를 출력합니다.

다른 팁

전환을 시도 할 수 있습니다 펼친 더 큰 정밀도. 지적한 바와 같이, 플로팅 포인트 수는 정밀도의 상당수 만 가지므로 더 많은 숫자를 표시 한 다음 정확하게 저장 될 수 있으므로 지정된 동작이 발생할 수 있습니다.

Delphi 도움말에서 :

기본 Win32 실제 유형

                                            | Significant | Size in 
Type     | Range                            | digits      | bytes
---------+----------------------------------+-------------+----------
Real     | -5.0 x 10^–324 .. 1.7 x 10^308   | 15–16       |   8  
Real48   | -2.9 x 10^–39 .. 1.7 x 10^38     | 11-12       |   6   
Single   | -1.5 x 10^–45 .. 3.4 x 10^38     |  7-8        |   4   
Double   | -5.0 x 10^–324 .. 1.7 x 10^308   | 15-16       |   8   
Extended | -3.6 x 10^–4951 .. 1.1 x 10^4932 | 10-20       |  10   
Comp     | -2^63+1 .. 2^63–1                | 10-20       |   8   
Currency | -922337203685477.5808..          |             | 
                    922337203685477.5807    | 10-20       |   8   

메모: 6 바이트 Real48 유형이 호출되었습니다 진짜 이전 버전의 Object Pascal에서. 델파이에서 구형 6 바이트 실제 유형을 사용하는 코드를 다시 컴파일하는 경우 Real48. {$ RealCompatibility On} 컴파일러 지시문을 사용하여 회전 할 수도 있습니다. 진짜 6 바이트 유형으로 돌아갑니다. 다음은 기본 실제 유형에 적용됩니다.

  • Real48 후진 호환성을 위해 유지됩니다. 스토리지 형식은 인텔 프로세서 아키텍처에 기초하지 않기 때문에 다른 부동 소수점 유형보다 성능이 느려집니다.
  • 펼친 다른 실제 유형보다 더 큰 정밀도를 제공하지만 휴대성이 떨어집니다. 플랫폼에서 공유 할 데이터 파일을 작성하는 경우 확장을 사용하여 조심하십시오.

범위가 중요한 숫자보다 큽니다. 따라서 숫자를 더 크게 가질 수 있으며 정확하게 저장할 수 있습니다. 나는 그 일이 일어나지 않도록 중요한 숫자로 반올림하는 것이 좋습니다.

부동 소수점 유형을 사용하는 경우 지정된 유형의 정밀 제한 사항을 알고 있어야합니다. 예를 들어 4 바이트 IEEE-754 유형은 약 7.5 자리의 정밀도를 가지고 있습니다. 8 바이트 IEEE-754 유형은 유의 한 숫자 수의 대략 두 배입니다. 분명히, 델파이 실제 유형은 약 11 자리 숫자에있는 정밀도를 가지고 있습니다. 그 결과, 지정한 형식의 여분의 숫자는 기본 10 형식의 값과베이스 2 플로팅 포인트 값 사이를 변환 할 수있는 노이즈 일 가능성이 높다는 것입니다.

우선, 다른 인수와 함께 STR을 사용하거나 앱의 유형의 정밀도를 높이는 데 도움을 줄 수 있는지 확인하려고합니다. (확장을 사용해 보셨습니까?)

최후의 수단으로서 (경고! 해결 방법 !!) 정렬 된 목록에 이진 표현과 함께 고객의 현악기 표현을 저장하려고합니다. 플로팅 포인트 값을 뒤로 쓰기 전에 테이블에 이미 일치하는 값이 있는지, 문자열 표현이 이미 알려져 있고 대신 사용할 수 있는지 알 수 있습니다. 이 조회를 빠르게 얻으려면 숫자 값으로 정렬하고 바이너리 검색을 사용하여 최상의 경기를 찾을 수 있습니다.

처리가 얼마나 필요한지에 따라 대안은 숫자를 BCD 형식으로 유지하여 원래 정확도를 유지하는 것입니다.

ExportrealValue와 CimportrealValue가 어떤 유형인지 모르면 이에 대답하기가 어렵습니다. 다른 사람들이 언급했듯이 실제 유형은 모두 다른 정밀도를 가지고 있습니다.

어떤 생각과는 반대로, 확장이 항상 더 높은 정밀도는 아닙니다. 확장 된 10-20의 중요한 수치는 15-16입니다. 열 번째 시그 무화과 주위에 문제가 있기 때문에 이미 확장 된 것을 사용하고있을 것입니다.

읽기와 쓰기를 더 많이 제어하려면 숫자를 문자열로 직접 전환하여 파일 스트림에 쓸 수 있습니다. 적어도 그렇게하면 Readln과 Writeln이 등 뒤에 좋지 않은 경우 걱정할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top