2013-03-25 2 views
0

내 프로그램을 부동 소수점 정밀도에서 배정 밀도로 변경하고 있습니다. 그럼에도 이진 파일에서 부동 소수점 숫자 을 읽어이 루틴을 시작합니다. (amxs 및 amxr 이중 크기이며, L이 INT C는 float 유형의 할당 된 배열에 double을 어떻게 저장합니까?

matlabfile=fopen("matlabfile","a+"); fprintf(matlabfile,"%d;%15.7e;%15.7e\n",l,amxs,amxr); fclose(matlabfile); 

이다

및 matlabfile이다 :

bufz = alloc1float(nz); 
for (i=0; i<nx; i++) { 
    nu = efread(bufz,sizeof(float),nz,vel); 
    for (k=0; k<nz; k++) 
     vn2[k][i] = bufz[k]; 
} 

배정도이어야하고 파일에 계산 된 값을 기록한다 계산 진행 파일 포인터)

내 질문 : double precision으로 산술 연산을 수행 할 때 C은 float 유형의 입력 매개 변수를 어떻게 처리하며 어떻게 반올림합니까? 출력 결과는? 표시된 것처럼 쉽게 표시 할 수 있습니까?

편집 : FILE * vel, * matlabfile;

int main(int argc, char *argv[]) 
{ 

int i, nx, nz, k, nu, l; 
double amxs, amxr; 
double *buf; 
double **vn2; 

vn2 = alloc2double(nx,nz); 
buf = alloc1float(nz); 

    /* read input binary file */ 
    for (i=0; i<nx; i++) { 
    nu = efread(buf,sizeof(float),nz,vel); 
    for (k=0; k<nz; k++) vn2[k][i] = bufz[k]; 
    } 

Arithmetics with double precision arrays, variables and vn2... 

// save output 
matlabfile=fopen("matlabfile","a+"); 
fprintf(matlabfile,"%d;%15.7e;%15.7e\n",l,amxs,amxr); 
fclose(matlabfile); 
+1

변수 선언, 즉 모든 유형이 무엇인지 표시해야합니다. –

+0

관련 코드를 제외한 모든 것을 보여 주셨습니다! 단 정밀도 데이터로 시작하는 배정 밀도 계산의 코드는 어디에 있습니까? –

+0

이름에서 알 수 있듯이 double 데이터 유형은 float에 비해 2 배의 정밀도를가집니다. 따라서 float에서 double로 변환 할 때 정밀도가 손실되지 않습니다 (추가 정밀도는 0으로 채울 수 있음). 반전 변환에서 절단이 발생합니다. – CuriousSid

답변

1

아니요. 그것은 (암시 적으로) doublefloat으로 변환하며 정확도를 잃습니다. 그것은 본질적으로 최하위 비트를 잘라 낸다.

구체적인 예가 부족하여 죄송 합니다만 9.223372036854775808과 같은 내용은 9.223372037이됩니다.

floatsdoubles에로드하면 비슷한 문제가 발생합니다. 그것들을 다른 형식으로 변환합니다. EDIT ... 잘 작동합니다.

+1

"다시 플로트로 캐스팅하면 이전과 같은 번호가 될 수 있습니다."- 확실합니까? –

+0

[Not quite] (http://stackoverflow.com/q/14773142/968261). –

+0

빠른 답장을 보내 주셔서 감사합니다. 부동 소수점 숫자를 자동으로 배정 밀도로 변환합니까? 아니면 계산 전에 입력 값을 변환해야합니까? 나는 먼저 float 타입의 bufz 배열에 저장한다는 것을 의미한다. – MichaelScott