提供: Japanese Scratch-Wiki

< ()

2017年7月18日 (火) 03:12時点におけるKurankuran (トーク | 投稿記録)による版 (英語版からの翻訳:Scientific Notationの項目は英語版でも要確認扱いだったので削除。(代替コードの証明部分、わかりづらかったの加筆))
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

() / ()
() / ()
カテゴリ 演算
タイプ

() / () ブロック (演算ブロック値ブロック) は、1つめの数を2つめの数でわって、その結果を返す。

結果がわり切れないときは、このブロックの返す値は小数になる。 わり算の 剰余(余り)がほしいときは、 () を () で割った余りブロックを使用すればよい。

使用する2つの数は、ブロック内に直接入力するか、または、値ブロックで指定する。

さらに、このブロック自身やその他の計算(足し算、引き算、かけ算など)ブロックを指定して、入れ子状にすることもできる。 これによって、より多くの数を使った計算を表現できる。

0によるわり算

2つめの数(わる数)が0の場合、Scratchオンラインエディターは次の値を返す。

・1つめの数が正の数のとき → inifinity (無限大)

・1つめの数が負の数のとき → -inifinity (負の無限大)

・1つめの数が0のとき → NaN (別の数式の中で評価するときは0になる)

一方、オフラインエディターでは、スクリプトエラーが発生し、スクリプトの実行が止まる。

よくある使用例

プロジェクトでわり算が必要になったとき使用する。 よくある使用例は次のとおり:

  • 計算機シミュレーターを作る
もし <(計算の種類) = [わり算]> なら
[答え v] を ((入力1) / (入力2)) にする
end
  • リスト内の項目すべての値を半分にする
[i v] を (1) にする
([数リスト v] の長さ::list) 回繰り返す
(i) 番目([数リスト v])を((((i) 番目([数リスト v])) / (2))を四捨五入) で置き換える


  • 数学の公式を使って計算する (三角形の面積を求める)
[面積 v] を (((底辺) * (高さ)) / (2)) にする

別のブロックによる表現

詳細は「代用ブロック一覧」を参照

このブロックの動作は、次のコードで再現できる:


(すべて v) 番目を [わられる数リスト v] から削除する//準備
(すべて v) 番目を [商リスト v] から削除する
[divident dev v] を [0] にする
[わられる数は? (x)] と聞いて待つ
[わられる数 v] を (答え) にする
[わる数は? (y)] と聞いて待つ
[わる数 v] を ([絶対値 v]\((答え)\)::operators) にする
[数2は負? v] を <(答え) < [0] > にする
もし <(わられる数) < [0] > なら
   [カウンター v] を (1) にする
でなければ
   [カウンター v] を [0] にする
end
[数1は負? v] を <(わられる数) < [0] > にする
((わられる数) の長さ) 回繰り返す
   [カウンター v] を (1) ずつ変える
   もし <((カウンター) 番目\((わられる数)\)の文字) = [.]> なら
      [わられる数の小数点位置 v] を (((わられる数) の長さ) - (カウンター)) にする
   でなければ
      ((カウンター) 番目\((わられる数)\)の文字) を [わられる数各位の数 v] に追加する
   end
end
 ((10) - (わられる数の小数点位置)) 回繰り返す
   [0] を [わられる数各位の数 v] に追加する
end
もし <((わる数) を四捨五入) = (わる数)> なら
   [わる数の小数点位置 v] を [0] にする
でなければ
   [カウンター v] を [0] にする
   <((カウンター) 番目\((わられる数)\)の文字) = [.]>  まで繰り返す
      [カウンター v] を (1) ずつ変える
   end
   [わる数の小数点位置 v] を (((わる数) の長さ::operators) - (カウンター)) にする
   [わられる数 v] を ((わられる数) * ([10^ v] \((わる数の小数点位置)\)::operators)) にする
   [わる数 v] を (((わる数) * ([10^ v] \((わる数の小数点位置)\)::operators)) を四捨五入) にする
end
[カウンター v] を [0] にする
[現在のわり算対象 v] を [] にする//入力は空。スペースではないので注意
 ([わられる数各位の数 v] の長さ::list)  回繰り返す
   [カウンター v] を (1) ずつ変える
   [現在のわり算対象 v] を ((現在のわり算対象) と ((カウンター) 番目([わられる数各位の数 v]))) にする
   [仮の商 v] を [9] にする
   <((わる数) * (仮の商)) < ((現在のわり算対象) + (1))> まで繰り返す
      [仮の商 v] を (-1) ずつ変える
   [仮の商 v] を [商リスト v] に追加する
   [現在のわり算対象 v] を ((現在のわり算対象) - ((わる数) * (仮の商))) にする
end
[.] を (([商リスト v] の長さ) - (8)) 番目に挿入する([商リスト v])
<<<((最後 v) 番目([商リスト v])) = [.] > または <<<((最後 v) 番目([商リスト v])) = [0]> かつ <((商リスト) を四捨五入) = (商リスト::list)>> かつ <[商リスト v] に [.] が含まれる>>> ではない> まで繰り返す
   (最後 v) 番目を [商リスト v] から削除する
<<<((1 v) 番目([商リスト v])) = [0]> または <((2 v) 番目([商リスト v])) = [.]>> ではない> まで繰り返す
   (1 v) 番目を [商リスト v] から削除する

このスクリプトを実行すると、「商リスト」に求める商(答え)が入る。

もうすこしシンプルな代用コードとしては次のものが考えられる:


もし <(b) < (0)> なら
[結果 v] を (((a) * ([e^ v]\(((-1) * ([ln v]\(((-1) * (b))\)))::operators)) * (-1)) にする
でなければ
[結果 v] を ((a) * ([e^ v]\(((-1) * ([ln v]\((b)\)))::operators)) にする
end

このスクリプトは、0で割ろうとしたときに次の値を返す。

・1/0 が「Infinity」を返す (元のブロックは、オフラインエディターではエラーになりスクリプトが停止する)

・-1/0 が「-Infinity」を返す(同上)

・0/0 が 「Error!」を返す。(元のブロックは、オフラインエディターではスクリプトが停止する)

このコードのしくみ

このコードのしくみを確認しておこう。 「でなければ」以降を数式で書くと次のとおり(1):

    a * e ^ (-1 * ln b) ……(1)

これがa / bと同じになること(2)を証明すれば良い

    a * e ^ (-1 * ln b) = a / b ……(2)

(2)式の両辺を「a」でわる

    e ^ (-1 * ln b)= 1 / b ……(3)

さらに両辺の自然対数をとる(4)

    ln e ^ (-1 * ln b) = ln (1 / b) ……(4)

lnは自然対数なので底がeであり、log a a b = bより、(4)式の左辺は次のように変形できる。

    左辺 = ln e ^ (-1 * ln b) = -1 * ln b ……(5)

a * log b はlog (ba) であるため、(5)式はさらに次のように変形できる:

    左辺 = -1 * ln b = ln (b-1) ……(6)

一方、(4)式の右辺は次のように変更できる

    右辺 = ln (1 / b) = ln b -1 ……(7)

よって左辺=右辺が成立し、(2)の等式が正しいことを証明できる。

負の数の対数は存在しないため、コードの前半(「もし」〜部分)では、bを正の数として扱い、最後に符号を反転している。

Scratchではln 0が「-infinity」 (負の無限大) を返すため、このコードを使えば0による除算を行ってもエラーが発生しない。

値という面で、元のブロックにもっとも近い動作をする代替コードは次のとおりである。このコードは0による除算が発生すると、「Error!」を返す。

(((b) * ([e^ v]\(((-1) * ([ln v]\(([絶対値 v]\((b)\)::operators)\)))\)::operators)) * ((a) * ([e^ v] \(((-1) * ([ln v]\(([絶対値 v]\((a)\)::operators)\)))\)::operators)))

関連項目