[ create a new paste ] login | about

Link: http://codepad.org/1iYkGYJD    [ raw code | output | fork ]

JfirKvmLSsanzoiDIwo - C, pasted on Mar 28:
#include <stdio.h>

void main(){
	printf("<IEEE754 double 内容表示器>\n0を入力したら終了。 10回やっても終了\n\n");
	int i=10; while(i-->0){
		double d; scanf("%lf",&d); if(d==0.0){goto L1;}

		
		unsigned long long s;
		  signed long long q;
		unsigned long long n;

		// 符号と、2^q乗のq と、 2^q * n の nに分解
		s= (   *(  (unsigned long long*)&d  )>>63   ) & 0x0000000000000001;
		q= (   *(  (unsigned long long*)&d  )>>52   ) & 0x00000000000007FF;
		n= (   *(  (unsigned long long*)&d  )       ) & 0x000FFFFFFFFFFFFF;

		q -= 1023;					// 1024 を 1の意味 として記録されてるので。1023 を引けば1になる。 
		n |= 0x0010000000000000;	// 1.2345 のうち 0.2345 だけ記録されてるので。 1.2345 の形にもどす。

		printf("signe=%llu q=%lld n=0x%llx\n",s,q,n);


		// 復元
		q += 1023; 					// 1024 を1の意味にする。
		n &= 0x000FFFFFFFFFFFFF;	// 1.2345 を 0.2345 の形にする。
		unsigned long long fukugen=   (s<<63)   |   (((unsigned long long)q)<<52)   |   n;
		printf("fukugen sita double=%14.14f\n", *((double*)&fukugen) );
	}
	L1:return;
}


Output:
<IEEE754 double 内容表示器>
0を入力したら終了。 10回やっても終了

signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000
signe=0 q=-895 n=0x14846e400159c4
fukugen sita double=0.00000000000000

Exited: ExitFailure 37


Create a new paste based on this one


Comments: