#topicpath ** 比較 [#g01170e7] [[IEEE 754]]にあるコードの細かい部分を取り上げて、C言語と[[LLPML]]の比較をします。 LLPMLの表記は冗長なため、0.9より式の中置記法をサポートしました。 ⇒ [[LLPML/簡略化]] C言語 LLPML(簡略版) LLPML(従来版) *** 関数呼び出し [#b4d1c153] printf("3.14159265 => "); Float(314159265, -8); printf("3.14159265 => "); Float(314159265, -8); <call name="printf"><string>3.14159265 => </string></call> <call name="Float"><int>314159265</int><int>-8</int></call> ---- printf("%d-%d-%p\n", sign, e2 + SIGN_DIGIT + EXP_MAX / 2, s & SIGN_MAX); printf("%d-%d-%p\n", sign, e2 + SIGN_DIGIT + EXP_MAX / 2, s & SIGN_MAX); <call name="printfln"> <string>%d-%d-%p</string> <var name="sign" /> <add> <var name="e2" /> <int name="SIGN_DIGIT" /> <div><int name="EXP_MAX" />2</div> </add> <and> <var name="s" /> <int name="SIGN_MAX" /> </and> </call> *** 変数宣言 [#ke04bbcf] int sign = 0, e2 = 0, ss; var sign = 0, e2 = 0, ss; varは変数宣言。型指定ではない。 <var-declare name="sign">0</var-declare> <var-declare name="e2">0</var-declare> <var-declare name="ss" /> *** 関数定義 [#ac1f7140] void Float(int s, int e10) { } function Float(s, e10) { } 型指定がない。 <function name="Float"> <arg name="s" /> <arg name="e10" /> </function> *** if [#m94c5191] if (s == 0) e10 = 0; if (s == 0) e10 = 0; <if> <cond> <equal><var name="s" />0</equal> </cond> <block> <let><var name="e10" />0</let> </block> </if> ---- if (s < 0) sign = 1, s = -s; if (s < 0) sign = 1, s = -s; <if> <cond> <less><var name="s" />0</less> </cond> <block> <let><var name="sign" />1</let> <let> <var name="s" /> <sub>0<var name="s" /></sub> </let> </block> </if> ---- if (e10 < 0) { } else if (e10 > 0) { } if (e10 < 0) { } else if (e10 > 0) { } <if> <cond> <less><var name="e10" />0</less> </cond> <block> </block> <cond> <greater><var name="e10" />0</greater> </cond> <block> </block> </if> ---- if (ss == 0 || s > INT_MAX / 2) { } if (ss == 0 || s > INT_MAX / 2) { } <if> <cond> <or-else> <equal><var name="ss" />0</equal> <greater> <var name="s" /> <div><int name="INT_MAX" />2</div> </greater> </or-else> </cond> <block> </block> </if> ---- if (s & 1 == 1 && s <= INT_MAX / 10) e10--, s *= 10; if (s & 1 == 1 && s <= INT_MAX / 10) e10--, s *= 10; <if> <cond> <and-also> <equal> <and><var name="s" />1</and> <int>1</int> </equal> <less-equal> <var name="s" /> <div><int name="INT_MAX" />10</div> </less-equal> </and-also> </cond> <block> <dec><var name="e10" /></dec> <var-mul><var name="s" />10</var-mul> </block> </if> *** while [#sdbd8394] while (s % 10 == 0) e10++, s /= 10; while (s % 10 == 0) e10++, s /= 10; <while> <cond> <equal> <mod><var name="s" />10</mod> <int>0</int> </equal> </cond> <block> <inc><var name="e10" /></inc> <var-div><var name="s" />10</var-div> </block> </while> ---- while (e10 != 0) { } while (e10 != 0) { } <while> <cond> <not-equal><var name="e10" />0</not-equal> </cond> <block> </block> </while> ---- while (s > 0 && s <= SIGN_MAX) e2--, s *= 2; while (s > 0 && s <= SIGN_MAX) e2--, s *= 2; <while> <cond> <and-also> <greater><var name="s" />0</greater> <less-equal> <var name="s" /> <int name="SIGN_MAX" /> </less-equal> </and-also> </cond> <block> <dec><var name="e2" /></dec> <var-mul><var name="s" />2</var-mul> </block> </while> ---- while (s > SIGN_MAX * 2 + 1) e2++, s = (s / 2) + (s & 1); while (s > SIGN_MAX * 2 + 1) e2++, s = (s / 2) + (s & 1); <while> <cond> <greater> <var name="s" /> <add> <mul><int name="SIGN_MAX" />2</mul> <int>1</int> </add> </greater> </cond> <block> <inc><var name="e2" /></inc> <let> <var name="s" /> <add> <div><var name="s" />2</div> <and><var name="s" />1</and> </add> </let> </block> </while> ** コメント [#u57c73bd] //#comment(below)