Top / IEEE 754 / 比較

比較

IEEE 754?にあるコードの細かい部分を取り上げて、C言語とLLPML?の比較をします。なお、LLPML?が冗長なのは仕様です。

関数呼び出し

printf("-0.1 => ");
Float(-1, -1);
<call name="printf">-0.1 => </call>
<call name="Float"><int>-1</int><int>-1</int></call>
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>

関数定義

void Float(int s, int e10) {
}
<function name="Float">
  <arg name="s" />
  <arg name="e10" />
</function>

変数宣言

int sign = 0, e2 = 0, ss;
<var-declare name="sign">0</var-declare>
<var-declare name="e2">0</var-declare>
<var-declare name="ss" />

if

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>
  <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>
  <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>
  <cond>
    <or>
      <equal><var name="ss" />0</equal>
      <greater>
        <var name="s" />
        <div><int name="INT_MAX" />2</div>
      </greater>
    </or>
  </cond>
  <block>
  </block>
</if>
if (s & 1 == 1 && s <= INT_MAX / 10);
  e10--, s *= 10;
<if>
  <cond>
    <and>
      <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>
  </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>
  <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>
  <cond>
    <not-equal><var name="e10" />0</not-equal>
  </cond>
  <block>
  </block>
</while>
while (s > 0 && s <= SIGN_MAX) e2--, s *= 2;
<while>
  <cond>
    <and>
      <greater><var name="s" />0</greater>
      <less-equal>
        <var name="s" />
        <int name="SIGN_MAX" />
      </less-equal>
    </and>
  </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>
  <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