Annotation of OpenXM/doc/OpenXM-specs/cmo-basic1.tex, Revision 1.2
1.2 ! noro 1: %% $OpenXM: OpenXM/doc/OpenXM-specs/cmo-basic1.tex,v 1.1.1.1 2000/01/20 08:52:46 noro Exp $
1.1 noro 2: //&jp \section{ 数, 多項式 の CMO 表現 }
3: //&eg \section{ CMOexpressions for numbers and polynomials }
4:
5: /*&C
6: @../SSkan/plugin/cmotag.h
7: \begin{verbatim}
8: #define CMO_MONOMIAL32 19
9: #define CMO_ZZ 20
10: #define CMO_QQ 21
11: #define CMO_ZERO 22
12: #define CMO_DMS_GENERIC 24
13: #define CMO_DMS_OF_N_VARIABLES 25
14: #define CMO_RING_BY_NAME 26
15: #define CMO_DISTRIBUTED_POLYNOMIAL 31
16: #define CMO_RATIONAL 34
17:
18:
19: #define CMO_INDETERMINATE 60
20: #define CMO_TREE 61
21: #define CMO_LAMBDA 62 /* for function definition */
22: \end{verbatim}
23:
24: */
25:
26: /*&jp
27: 以下, グループ CMObject/Basic1, CMObject/Tree
28: および CMObject/DistributedPolynomial
29: に属する CMObject の形式を説明する.
30: \noroa{ tagged list を導入すべきか? cf. SSkan/plugin/cmo.txt }
31:
32: */
33: /*&eg
34: In the sequel, we will explain on the groups
35: CMObject/Basic1, CMObject/Tree
36: and CMObject/DistributedPolynomial.
37: */
38:
39: /*&jp
40:
41: \bigbreak
42: \noindent
43: Group CMObject/Basic1 requires CMObject/Basic0. \\
44: ZZ, QQ, Zero, Rational, Indeterminate,$\in$ CMObject/Basic1. \\
45: \begin{eqnarray*}
46: \mbox{Zero} &:& ({\tt CMO\_ZERO}) \\
47: & & \mbox{ --- ユニバーサルな ゼロを表す. } \\
48: \mbox{ZZ} &:& ({\tt CMO\_ZZ},{\sl int32}\, {\rm f}, {\sl byte}\, \mbox{a[1]}, \ldots
49: {\sl byte}\, \mbox{a[m]} ) \\
50: &:& \mbox{ --- bignum をあらわす. a[i] についてはあとで説明}\\
51: \mbox{QQ} &:& ({\tt CMO\_QQ}, {\sl ZZ}\, {\rm a}, {\sl ZZ}\, {\rm b}) \\
52: & & \mbox{ --- 有理数 $a/b$ を表す. } \\
53: \mbox{Rational} &:& ({\tt CMO\_RATIONAL}, {\sl CMObject}\, {\rm a}, {\sl CMObject}\, {\rm b}) \\
54: & & \mbox{ --- $a/b$ を表す. } \\
55: \mbox{Indeterminate} &:& ({\tt CMO\_INDETERMINATE}, {\sl Cstring}\, {\rm v}) \\
56: & & \mbox{ --- 変数名 $v$ . } \\
57: \end{eqnarray*}
58: */
59: /*&eg
60:
61: \bigbreak
62: \noindent
63: Group CMObject/Basic1 requires CMObject/Basic0. \\
64: ZZ, QQ, Zero, Rational, Indeterminate,$\in$ CMObject/Basic1. \\
65: \begin{eqnarray*}
66: \mbox{Zero} &:& ({\tt CMO\_ZERO}) \\
67: & & \mbox{ --- Universal zero } \\
68: \mbox{ZZ} &:& ({\tt CMO\_ZZ},{\sl int32}\, {\rm f}, {\sl byte}\, \mbox{a[1]}, \ldots
69: {\sl byte}\, \mbox{a[m]} ) \\
70: &:& \mbox{ --- bignum. The meaning of a[i] will be explained later.}\\
71: \mbox{QQ} &:& ({\tt CMO\_QQ}, {\sl ZZ}\, {\rm a}, {\sl ZZ}\, {\rm b}) \\
72: & & \mbox{ --- Rational number $a/b$. } \\
73: \mbox{Rational} &:& ({\tt CMO\_RATIONAL}, {\sl CMObject}\, {\rm a}, {\sl CMObject}\, {\rm b}) \\
74: & & \mbox{ --- Rational expression $a/b$. } \\
75: \mbox{Indeterminate} &:& ({\tt CMO\_INDETERMINATE}, {\sl Cstring}\, {\rm v}) \\
76: & & \mbox{ --- Variable name $v$ . } \\
77: \end{eqnarray*}
78: */
79: /*&C
80:
81: */
82:
83: /*&jp
84: Indeterminate は変数名をあらわす.
85: v はバイト列であればなにを用いてもよいが,
86: システム毎に変数名として用いられるバイト列は制限がある.
87: 各システム xxx は任意の文字列を各システム固有の変数名へ1対1に変換できるように
88: 実装しないといけない.
89: (これを
90: {\tt Dx} は {\tt \#dx} と変換するなどの
91: escape sequence を用いて実現するのは, 無理があるようである.
92: テーブルを作成する必要があるであろう.)
93: */
94: /*&eg
95: Indeterminate is a name of a variable.
96: v may be any sequence of bytes, but each system has its own
97: restrictions on the names of variables.
98: Indeterminates of CMO and internal variable names must be translated
99: in one to one correspondence.
100: */
101:
102: /*&jp
103:
104: \noindent
105: Group CMObject/Tree requires CMObject/Basic1. \\
106: Tree, Lambda $\in$ CMObject/Basic1. \\
107: \begin{eqnarray*}
108: \mbox{Tree} &:& ({\tt CMO\_TREE}, {\sl Cstring}\, {\rm name},
109: {\sl Cstring}\, {\rm cdname}, {\sl List}\, {\rm leaves}) \\
110: & & \mbox{ --- 名前 name の定数または関数. 関数の評価はおこなわない. } \\
111: & & \mbox{ --- cdname は空文字列でなければ name の意味が説明されている }\\
112: & & \mbox{ --- OpenMath CD (content dictionary) の名前. } \\
113: \mbox{Lambda} &:& ({\tt CMO\_LAMBDA}, {\sl List}\, {\rm args},
114: {\sl Tree} {\rm body}) \\
115: & & \mbox{ --- body を args を引数とする関数とする. } \\
116: & & \mbox{ --- optional な引数が必要なときは, leaves の後へつづける.} \\
117: \end{eqnarray*}
118: */
119: /*&eg
120:
121: \noindent
122: Group CMObject/Tree requires CMObject/Basic1. \\
123: Tree, Lambda $\in$ CMObject/Basic1. \\
124: \begin{eqnarray*}
125: \mbox{Tree} &:& ({\tt CMO\_TREE}, {\sl Cstring}\, {\rm name},
126: {\sl Cstring}\, {\rm cdname}, {\sl List}\, {\rm leaves}) \\
127: & & \mbox{ --- A function or a constant of name. Functions are not evaluated. } \\
128: & & \mbox{ --- cdname may be a null. If it is not null, it is the name of}\\
129: & & \mbox{ --- the OpenMath CD (content dictionary). } \\
130: \mbox{Lambda} &:& ({\tt CMO\_LAMBDA}, {\sl List}\, {\rm args},
131: {\sl Tree} {\rm body}) \\
132: & & \mbox{ --- a function with the arguments body. } \\
133: & & \mbox{ --- optional arguments come after leaves.} \\
134: \end{eqnarray*}
135: */
136:
137: /*&C
138:
139: */
140:
141: /*&jp
142: 数式を処理するシステムでは, Tree 構造が一般にもちいられる.
143: たとえば, $\sin(x+e)$ は,
144: {\tt (sin, (plus, x, e))}
145: なる Tree であらわすのが一般的である.
146: Tree の表現を スタックマシンのレベルでおこなうとすると,
147: {\tt ox\_BEGIN\_BLOCK}, {\tt ox\_END\_BLOCK} で評価を抑制するのが
148: 一つの方法である (cf. Postscript の {\tt \{ }, {\tt \} }).
149: たとえば上の方法では
150: {\tt x, e, plus, sin } を begin block, end block でかこめばよろしい.
151: われわれはスタックマシンの実装をなるべく簡単にするという立場をとりたい,
152: また数学オブジェクトを OX スタックマシンと CMObject を混在して表現したく
153: ない.
154: したがって,
155: Tree 構造は Open Math 風の表現をもちいた CMO を導入することにした.
156: またこのほうが, われわれの想定するシステム xxx において, Open XM 対応が
157: はるかに容易である.
158: なお, Tree は, Open Math では, Symbol, Application のメカニズムに相当する.
159: */
160: /*&eg
161: In many computer algebra systems, mathematical expressions are usually
162: expressed in terms of a tree structure.
163: For example,
164: $\sin(x+e)$ is expressed as
165: {\tt (sin, (plus, x, e))}
166: as a tree.
167: We can @@@
168: */
169:
170:
171: /*&C
172:
173: */
174: /*&jp
175: Lambda は関数を定義するための関数である.
176: Lisp の Lambda 表現と同じ.
177:
178: \noindent
179: 例: $sin(x+e)$ の表現.
180: \begin{verbatim}
181: (CMO_TREE, (CMO_STRING, "sin"), (CMO_STRING, "basic"),
182: (CMO_LIST,[size=]1,
183: (CMO_TREE, (CMO_STRING, "plus"), (CMO_STRING, "basic"),
184: (CMO_LIST,[size=]2, (CMO_INDETERMINATE,"x"),
185: (CMO_TREE,(CMO_STRING, "e"), 自然対数の底
186: (CMO_STRING, "basic"))
187: ))
188: )
189: )
190: \end{verbatim}
191:
192: \noindent
193: Example:
194: \begin{verbatim}
195: sm1> [(plus) (Basic) [(123).. (345)..]] [(class) (tree)] dc ::
196: Class.tree [ $plus$ , $Basic$ , [ 123 , 345 ] ]
197: \end{verbatim}
198:
199:
200:
201: \bigbreak
202: 次に, 分散表現多項式に関係するグループを定義しよう.
203:
204: \medbreak
205: \noindent
206: Group CMObject/DistributedPolynomials requires CMObject/Basic0,
207: CMObject/Basic1. \\
208: Monomial, Monomial32, Coefficient, Dpolynomial, DringDefinition,
209: Generic DMS ring, RingByName, DMS of N variables $\in$
210: CMObject/DistributedPolynomials. \\
211: \begin{eqnarray*}
212: \mbox{Monomial} &:& \mbox{Monomial32}\, |\, \mbox{Zero} \\
213: \mbox{Monomial32}&:& ({\tt CMO\_MONOMIAL32}, {\sl int32}\, n,
214: {\sl int32}\, \mbox{e[1]}, \ldots,
215: {\sl int32}\, \mbox{e[n]}, \\
216: & & \ \mbox{Coefficient}) \\
217: & & \mbox{ --- e[i] で, $n$ 変数 monomial
218: $x^e = x_1^{e_1} \cdots x_n^{e_n}$ の各指数 $e_i$
219: をあらわす.} \\
220: \mbox{Coefficient}&:& \mbox{ZZ} | \mbox{Integer32} \\
221: \mbox{Dpolynomial}&:& \mbox{Zero} \\
222: & & |\ ({\tt CMO\_DISTRIBUTED\_POLYNOMIAL},{\sl int32} m, \\
223: & & \ \ \mbox{DringDefinition},
224: [\mbox{Monomial32}|\mbox{Zero}], \\
225: & &\ \
226: \{\mbox{Monomial32}\}) \\
227: & &\mbox{--- m はモノミアルの個数である.}\\
228: \mbox{DringDefinition}
229: &:& \mbox{DMS of N variables} \\
230: & & |\ \mbox{RingByName} \\
231: & & |\ \mbox{Generic DMS ring} \\
232: & & \mbox{ --- 分散表現多項式環の定義. } \\
233: \mbox{Generic DMS ring}
1.2 ! noro 234: &:& \mbox{({\tt CMO\_DMS\_GENERIC}) --- 新版はこちら}\\
1.1 noro 235: \mbox{RingByName}&:& ({\tt CMO\_RING\_BY\_NAME}, {\sl Cstring}\ {\rm s}) \\
236: & & \mbox{ --- 名前 s で, 格納された ring 定義.} \\
237: \mbox{DMS of N variables}
238: &:& ({\tt CMO\_DMS\_OF\_N\_VARIABLES}, \\
239: & & \ ({\tt CMO\_LIST}, {\sl int32}\, \mbox{m},
240: {\sl Integer32}\, \mbox{n}, {\sl Integer32}\,\mbox{p} \\
241: & & \ \ [,{\sl object}\,\mbox{s}, {\sl Cstring}\,\mbox{c},
242: {\sl List}\, \mbox{vlist},
243: {\sl List}\, \mbox{wvec}, {\sl List}\, \mbox{outord}]) \\
244: & & \mbox{ --- m はあとに続く要素の数} \\
245: & & \mbox{ --- n は変数の数, p は 標数} \\
246: & & \mbox{ --- s は ring の名前} \\
247: & & \mbox{ --- c は係数環, QQ, ZZ の場合は文字列で QQ, ZZ と書く.} \\
248: & & \mbox{ --- vlist は Indeterminate のリスト(新版). 多項式環の変数リスト} \\
249: & & \mbox{ --- wvec は order をきめる weight vector,} \\
250: & & \mbox{ --- outord は出力するときの変数順序.} \\
251: \end{eqnarray*}
252:
253: RingByName や DMS of N variables はなくても, DMS を定義できる.
254: したがって, これらを実装してないシステムで DMS を扱うものが
255: あってもかまわない.
256:
257: 以下, 以上の CMObject にたいする,
258: xxx = asir, kan の振舞いを記述する.
259:
260: \subsection{ Zero}
261: CMO では ゼロの表現法がなんとうりもあるが,
262: どのようなゼロをうけとっても,
263: システムのゼロに変換できるべきである.
264: (たとえば, asir は 0 はただ一つ.)
265:
266:
267:
268: \subsection{ 整数 ZZ }
269:
270: \begin{verbatim}
271: #define CMO_ZZ 20
272: \end{verbatim}
273:
274:
275: この節ではOpen xxx 規約における任意の大きさの整数(bignum)の扱いについて
276: 説明する.
277: Open XM 規約における多重精度整数を表すデータ型 CMO\_ZZ は GNU MPライブ
278: ラリなどを参考にして設計されていて, 符号付き絶対値表現を用いている.
279: (cf. {\tt kan/sm1} の配布ディレクトリのなかの {\tt plugin/cmo-gmp.c})
280: CMO\_ZZ は次の形式をとる.\\
281: \begin{tabular}{|c|c|c|c|c|}
282: \hline
283: {\tt int32 CMO\_ZZ} & {\tt int32 $f$} & {\tt int32 $b_0$} & $\cdots$ &
284: {\tt int32 $b_{n}$} \\
285: \hline
286: \end{tabular} \\
287: $f$ は32bit整数である.
288: $b_0, \ldots, b_n$ は unsigned int32 である.
289: $|f|$ は $n+1$ である.
290: この CMO の符号は $f$ の符号で定める.
291: 前述したように, 32bit整数の負数は 2 の補数表現で表される.
292:
293: Open xxx 規約では上の CMO は以下の整数を意味する.
294: \[
295: \mbox{sgn}(f)\times (b_0 R^{0}+ b_1 R^{1} + \cdots + b_{n-1}R^{n-1} + b_n R^n).
296: \]
297: ここで $R = 2^{32}$ である.
298: {\tt int32} を network byte order で表現しているとすると,
299: 例えば, 整数 $14$ は CMO\_ZZ で表わすと,
300: \[
301: \mbox{(CMO\_ZZ, 1, 0, 0, 0, e)},
302: \]
303: と表わす.
304: これはバイト列では
305: \[
306: \mbox{\tt 00 00 00 14 00 00 00 01 00 00 00 0e}
307: \]
308: となる.
309:
310:
311: なお ZZ の 0 ( (ZZ) 0 と書く ) は,
312: {\tt (CMO\_ZZ, 00,00,00,00)}
313: と表現する.
314:
315:
316: \subsection{ 分散表現多項式 Dpolynomial }
317:
318: 環とそれに属する多項式は次のような考えかたであつかう.
319:
320: Generic DMS ring に属する元は,
321: 変数を $n$ 個持つ 適当な係数集合 $K$ を持つ多項式環 $K[x_1, \ldots, x_n]$
322: の元である.
323: 係数集合 $K$ がなにかは, 実際データを読み込み, Coefficient を見た段階で
324: わかる.
325: この環に属する多項式を CMO 形式でうけとった場合, 各サーバはその
326: サーバの対応する Object に変換しないといけない.
327: この変換の仕方は, 各サーバ毎にきめる.
328:
329: Asir の場合は, $K[x_1, \ldots, x_n]$ の元は分散表現多項式に変換される.
330: \noroa{ でも, order はどうなるの? }
331:
332: {\tt kan/sm1} の場合は事情は複雑である.
333: {\tt kan/sm1} は, Generic DMS ring にあたる クラスをもたない.
334: つまり, Default で存在する, $n$ 変数の分散表現多項式環は存在しないわけである.
335: したがって, {\tt kan/sm1} では, DMS of N variables が来た場合,
336: これを CurrentRing の元として読み込む. CurrentRing の変数の数が $n'$
337: で, $n' < n$ だと新しい多項式環を生成してデータを読み込む.
338: Order その他の optional 情報はすべて無視する.
339:
340: DMS の 2 番目のフィールドで,
341: Ring by Name を用いた場合, 現在の名前空間で変数 yyy に格納された ring object
342: の元として, この多項式を変換しなさいという意味になる.
343: {\tt kan/sm1} の場合, 環の定義は ring object として格納されており,
344: この ring object を 変数 yyy で参照することにより CMO としてうけとった
345: 多項式をこの ring の元として格納できる.
346:
347:
348:
349:
350:
351: \medbreak \noindent
352: {\bf Example}:
353: (すべての数の表記は 16 進表記)
354: {\footnotesize \begin{verbatim}
355: Z/11Z [6 variables]
356: (kxx/cmotest.sm1) run
357: [(x,y) ring_of_polynomials ( ) elimination_order 11 ] define_ring ;
358: (3x^2 y). cmo /ff set ;
359: [(cmoLispLike) 1] extension ;
360: ff ::
361: Class.CMO CMO StandardEncoding: size = 52, size/sizeof(int) = 13,
362: tag=CMO_DISTRIBUTED_POLYNOMIAL
363:
364: 0 0 0 1f 0 0 0 1 0 0 0 18 0 0 0 13 0 0 0 6
365: 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 1
366: 0 0 0 0 0 0 0 2 0 0 0 3
367:
368: ff omc ::
369: (CMO_DISTRIBUTED_POLYNOMIAL[1f],[size=]1,(CMO_DMS_GENERIC[18],),
370: (CMO_MONOMIAL32[13],3*x^2*y),),
371: \end{verbatim} }
372: length は, monomial の数$+2$ である.
373: $ 3 x^2 y$ は 6 変数の多項式環の元としてみなされている.
374: %%Prog: (3x^2 y). cmosave ===> debug/cmodata1.cmo
375: %%\\ 反省: 分散多項式の定義で,
376: %%{\tt CMO\_LIST} でなく, {\tt CMO\_DMS} がはじめにくるべきだったのでは?
377: %%あたらしい 分散多項式の定義は次のようにすべき:
378: %% 修正済み. 1999, 9/13
379:
380:
381:
382: \subsection{再帰表現多項式の定義}
383:
384: \begin{verbatim}
385: #define CMO_RECURSIVE_POLYNOMIAL 27
386: #define CMO_POLYNOMIAL_IN_ONE_VARIABLE 33
387: \end{verbatim}
388:
389: Group CMObject/RecursivePolynomial requires CMObject/Basic0, CMObject/Basic1.\\
390: Polynomial in 1 variable, Coefficient, Name of the main variable,
391: Recursive Polynomial, Ring definition for recursive polynomials
392: $\in$ CMObject/RecursivePolynomial \\
393:
394: \begin{eqnarray*}
395: \mbox{Polynomial in 1 variable} &:&
396: \mbox{({\tt CMO\_POLYNOMIAL\_IN\_ONE\_VARIABLE},\, {\sl int32}\, m, } \\
397: & & \quad \mbox{ Name of the main variable }, \\
398: & & \quad \mbox{ \{ {\sl int32} e, Coefficient \}} \\
399: & & \mbox{ --- m はモノミアルの個数. } \\
400: & & \mbox{ --- e, Coefficieint はモノミアルを表現している. } \\
401: & & \mbox{ --- 順序の高い順にならべる. 普通は巾の高い順.} \\
402: & & \mbox{ --- e は 1変数多項式の巾をあらわす. } \\
403: \mbox{Coefficient} &:& \mbox{ ZZ} \,|\, \mbox{ QQ } \,|\,
404: \mbox{ integer32 } \,|\,
405: \mbox{ Polynomial in 1 variable } \\
406: & & \quad \,|\, \mbox{Tree} \,|\, \mbox{Zero} \,|\,\mbox{Dpolynomial}\\
407: \mbox{Name of the main variable } &:&
408: \mbox{ {\sl int32} v } \\
409: & & \mbox{ --- v は 変数番号 (0 からはじまる) を表す. } \\
410: \mbox{Recursive Polynomial} &:&
411: \mbox{ ( {\tt CMO\_RECURSIVE\_POLYNOMIAL}, } \\
412: & & \quad \mbox{ Ring definition for
413: recursive polynomials, } \\
414: & & \quad
415: \mbox{ Polynomial in 1 variable}\, | \, \mbox{Coefficient} \\
416: \mbox{Ring definition for recursive polynomials }
417: & : & \mbox{ {\sl List} v } \\
418: & & \quad \mbox{ --- v は, 変数名(indeterminate) のリスト. } \\
419: & & \quad \mbox{ --- 順序の高い順. } \\
420: \end{eqnarray*}
421:
422: \bigbreak
423: \noindent
424: 実例:
425: \begin{verbatim}
426: (CMO_RECURSIEVE_POLYNOMIAL, ("x","y"),
427: (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 0, <--- "x"
428: 3, (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 1, <--- "y"
429: 5, 1234,
430: 0, 17),
431: 1, (CMO_POLYNOMIAL_IN_ONE_VARIABLE, 2, 1, <--- "y"
432: 10, 1,
433: 5, 31)))
434: \end{verbatim}
435: これは,
436: $$ x^3 (1234 y^5 + 17 ) + x^1 (y^10 + 31 y^5) $$
437: をあらわす.
438: 非可換多項式もこの形式であらわしたいので, 積の順序を上のように
439: すること. つまり, 主変数かける係数の順番.
440:
441: \noindent
442: \begin{verbatim}
443: sm1
444: sm1>(x^2-h). [(class) (recursivePolynomial)] dc /ff set ;
445: sm1>ff ::
446: Class.recursivePolynomial h * ((-1)) + (x^2 * (1))
447: \end{verbatim}
448:
449:
450:
451: int32 と Integer32 の違い.
452: 次にくるデータがかならず int32 とわかっておれば,
453: int32 を用いる.
454: 次のデータ型がわからないとき Integer32 を用いる.
455:
456:
457: \subsection{CPU依存の double }
458:
459: \begin{verbatim}
460: #define CMO_64BIT_MACHINE_DOUBLE 40
461: #define CMO_ARRAY_OF_64BIT_MACHINE_DOUBLE 41
462: #define CMO_128BIT_MACHINE_DOUBLE 42
463: #define CMO_ARRAY_OF_128BIT_MACHINE_DOUBLE 43
464: \end{verbatim}
465:
466: \noindent
467: Group CMObject/MachineDouble requires CMObject/Basic0.\\
468: 64bit machine double, Array of 64bit machine double
469: 128bit machine double, Array of 128bit machine double
470: $\in$ CMObject/MachineDouble \\
471:
472: \begin{eqnarray*}
473: \mbox{64bit machine double} &:&
474: \mbox{({\tt CMO\_64BIT\_MACHINE\_DOUBLE}, } \\
475: & & \quad \mbox{ {\sl byte} s1 , \ldots , {\sl byte}} s8)\\
476: & & \mbox{ --- s1, $\ldots$, s8 は {\tt double} (64bit). } \\
477: & & \mbox{ --- この表現はCPU依存である.}\\
478: && \mbox{\quad\quad mathcap に CPU 情報を付加しておく.} \\
479: \mbox{Array of 64bit machine double} &:&
480: \mbox{({\tt CMO\_ARRAY\_OF\_64BIT\_MACHINE\_DOUBLE}, {\sl int32} m, } \\
481: & & \quad \mbox{ {\sl byte} s1[1] , \ldots , {\sl byte}}\, s8[1], \ldots , {\sl byte}\, s8[m])\\
482: & & \mbox{ --- s*[1], $\ldots$ s*[m] は m 個の double (64bit) である. } \\
483: & & \mbox{ --- この表現はCPU依存である.}\\
484: & & \mbox{ \quad\quad mathcap に CPU 情報を付加しておく.} \\
485: \mbox{128bit machine double} &:&
486: \mbox{({\tt CMO\_128BIT\_MACHINE\_DOUBLE}, } \\
487: & & \quad \mbox{ {\sl byte} s1 , \ldots , {\sl byte}} s16)\\
488: & & \mbox{ --- s1, $\ldots$, s16 は {\tt long double} (128bit). } \\
489: & & \mbox{ --- この表現はCPU依存である.}\\
490: && \mbox{\quad\quad mathcap に CPU 情報を付加しておく.} \\
491: \mbox{Array of 128bit machine double} &:&
492: \mbox{({\tt CMO\_ARRAY\_OF\_128BIT\_MACHINE\_DOUBLE}, {\sl int32} m, } \\
493: & & \quad \mbox{ {\sl byte} s1[1] , \ldots , {\sl byte}} s16[1], \ldots , {\sl byte} s16[m])\\
494: & & \mbox{ --- s*[1], $\ldots$ s*[m] は m 個の long double (128bit) である. } \\
495: & & \mbox{ --- この表現はCPU依存である.}\\
496: & & \mbox{ \quad\quad mathcap に CPU 情報を付加しておく.}
497: \end{eqnarray*}
498:
499: \bigbreak
500: 次に IEEE 準拠の float および Big float を定義しよう.
501: \begin{verbatim}
502: #define CMO_BIGFLOAT 50
503: #define CMO_IEEE_DOUBLE_FLOAT 51
504: \end{verbatim}
505:
506: IEEE 準拠の float については,
507: IEEE 754 double precision floating-point format
508: (64 bit) の定義を見よ.
509:
510: \noindent
511: Group CMObject/Bigfloat requires CMObject/Basic0, CMObject/Basic1.\\
512: Bigfloat
513: $\in$ CMObject/Bigfloat \\
514:
515: \begin{eqnarray*}
516: \mbox{Bigfloat} &:&
517: \mbox{({\tt CMO\_BIGFLOAT}, } \\
518: & & \quad \mbox{ {\sl ZZ} a , {\sl ZZ} e})\\
519: & & \mbox{ --- $a \times 2^e$ をあらわす. } \\
520: \end{eqnarray*}
521:
522:
523: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>