teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

VC\+\+2010 SP1 インストール記念に質問者の希望とは違うけど検証結果証跡として記録

2015/12/11 16:22

投稿

ipadcaron
ipadcaron

スコア1693

answer CHANGED
@@ -22,4 +22,96 @@
22
22
  return buffer;
23
23
 
24
24
  コード
25
- ```
25
+ ```
26
+
27
+ ```C
28
+ // TEST01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
29
+ //
30
+
31
+ #include "stdafx.h"
32
+
33
+ #include <stdio.h>
34
+ #include <stdlib.h>
35
+
36
+ typedef unsigned char uchar;
37
+
38
+ typedef union bitfloat_t {
39
+ float value;
40
+ uchar bytes[sizeof(float)];
41
+ } bitfloat_t;
42
+
43
+ #define FLOATLEN sizeof(float) * 8
44
+
45
+ float bits2float(uchar* buffer);
46
+ void clearMem(uchar* buffer, int size);
47
+ void float2bits(float v, uchar* buffer);
48
+ void test(char *title, float val);
49
+
50
+ int _tmain(int argc, _TCHAR* argv[])
51
+ {
52
+ test("テスト1", 1e26F);
53
+ test("テスト2", 1.1234567890123456789F);
54
+ test("テスト3", 1.1234567e10F);
55
+
56
+ return 0;
57
+ }
58
+
59
+ void test(char *title, float val) {
60
+
61
+ bitfloat_t v;
62
+ uchar buffer[FLOATLEN +1];
63
+ v.value = val;
64
+
65
+ float2bits(val, buffer);
66
+
67
+ printf("%s\n", title);
68
+
69
+ printf("実数値→変換:%f => %s\n", val, buffer);
70
+
71
+ float ff = bits2float(buffer);
72
+
73
+ printf("変換→実数値:%s => %f(%e)\n", buffer, ff, ff);
74
+
75
+ fgetc(stdin);
76
+
77
+ }
78
+
79
+ void clearMem(uchar* buffer, int size) {
80
+ for (int i=0;i < size;i++) buffer[i] = 0;
81
+ }
82
+
83
+ float bits2float(uchar* buffer) {
84
+ bitfloat_t vv;
85
+ clearMem(vv.bytes, sizeof(vv));
86
+
87
+ int maxLen = FLOATLEN;
88
+
89
+ uchar bit = 0;
90
+ for (int i=0;i < maxLen;i++) {
91
+ if (bit == 0) bit = 0x80;
92
+ vv.bytes[i / 8] |= buffer[i] == '1' ? bit : 0;
93
+ bit >>= 1;
94
+ }
95
+
96
+ return vv.value;
97
+ }
98
+
99
+ void float2bits(float v, uchar* buffer) {
100
+ bitfloat_t vv;
101
+ vv.value = v;
102
+
103
+ int maxLen = FLOATLEN;
104
+
105
+ buffer[maxLen] = 0;
106
+ uchar bit = 0;
107
+ for (int i=0;i < maxLen;i++) {
108
+ if (bit == 0) bit = 0x80;
109
+ buffer[i] = vv.bytes[i / 8] & bit ? '1' : '0';
110
+ bit >>= 1;
111
+ }
112
+ }
113
+
114
+
115
+ ```
116
+ VC++2010 Sp1 当てた記念に残しておきます。
117
+ ![実行結果](534b5c41ba8ead760ae374e774f652e3.png)