Top / IEEE 754 / 比較

比較

IEEE 754?にあるコードの細かい部分を取り上げて、C言語とLLPML?の比較をします。

LLPMLの表記は冗長なため、0.9より式の中置記法をサポートしました。 ⇒ LLPML/簡略化?

C言語
LLPML(簡略版)
LLPML(従来版)

関数呼び出し

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 and SIGN_MAX);

andを使用しているのは、XML中では & をエンティティで記述することになって不便なため。

<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>

変数宣言

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" />

関数定義

void Float(int s, int e10) {
}
function Float(s, e10) {
}

型指定がない。

<function name="Float">
  <arg name="s" />
  <arg name="e10" />
</function>

if

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 (0 > s) sign = 1, s = -s;

不等号の向きが逆になっているのは、XML中では < をエンティティで記述することになって不便なため。

<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 (0 > e10) {
} else if (e10 > 0) {
}

不等号の向きが逆になっているのは、XML中では < をエンティティで記述することになって不便なため。

<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 and 1 == 1 andalso INT_MAX / 10 >= s)
  e10--, s *= 10;

不等号の向きが逆になっているのとandやandalsoを使用しているのは、XML中では < や & をエンティティで記述することになって不便なため。

<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

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 andalso SIGN_MAX >= s) e2--, s *= 2;

不等号の向きが逆になっているのとandalsoを使用しているのは、XML中では < や & をエンティティで記述することになって不便なため。

<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 and 1);

andを使用しているのは、XML中では & をエンティティで記述することになって不便なため。

<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>

コメント



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS