提供: Japanese Scratch-Wiki

< ()

(→‎0によるわり算: Scratch2.0以降同じ動作なので表現を変更)
 
6行目: 6行目:
 
}}
 
}}
  
'''() / ()''' [[ブロック]] ([[演算ブロック]]/[[値ブロック]]) は、1つめの数を2つめの数でわって、その結果を返す。
+
'''() / ()''' [[ブロック]] ([[演算ブロック]]/[[値ブロック]]) は、1つめの数を2つめの数で割って、その結果を返す。
  
結果がわり切れないときは、このブロックの返す値は小数になる。 わり算の [[wikipedia:剰余|剰余]](余り)がほしいときは、 [[() を () で割った余り (ブロック)|() を () で割った余り]]ブロックを使用すればよい。
+
結果が割り切れないときは、このブロックの返す値は小数になる。 割り算の [[wikipedia:剰余|剰余]](余り)がほしいときは、 [[() を () で割った余り (ブロック)|() を () で割った余り]]ブロックを使用すればよい。
 
 
使用する2つの数は、ブロック内に直接入力するか、または、[[値ブロック]]で指定する。
 
  
 
さらに、このブロック自身やその他の計算([[() + () (ブロック)|足し算]]、[[() - () (ブロック)‎|引き算]]、[[() * () (ブロック)|かけ算]]など)ブロックを指定して、入れ子状にすることもできる。 これによって、より多くの数を使った計算を表現できる。
 
さらに、このブロック自身やその他の計算([[() + () (ブロック)|足し算]]、[[() - () (ブロック)‎|引き算]]、[[() * () (ブロック)|かけ算]]など)ブロックを指定して、入れ子状にすることもできる。 これによって、より多くの数を使った計算を表現できる。
  
==0によるわり算==
+
==ゼロ除算==
2つめの数(わる数)が0の場合、次の値を返す。
+
割る数を±0に指定したときは、[[Scratch 2.0]]以降では、以下の値が返される:
 
 
・1つめの数が正の数のとき → inifinity (無限大)
 
 
 
・1つめの数が負の数のとき → '''-'''inifinity (負の無限大)
 
  
・1つめの数が0のとき → NaN (別の数式の中で評価するときは0になる)
+
* 両方の引数の符号が一致するとき(例: 1/0, -1/-0) Infinity(正の無限大)
 +
* 両方の引数の符号が一致しないとき(例: -1/0, 1/-0) -Infinity(負の無限大)
 +
* 一つ目の引数が±0であるとき (例: 0/0, -0/0) NaN(非数)
  
[[Scratch 1.4]]では、[[スクリプト#スクリプトエラー|スクリプトエラー]]が発生し、スクリプトの実行が止まる。)
+
[[Scratch 1.4]]以下では、[[スクリプト#スクリプトエラー|スクリプトエラー]]が発生し、スクリプトの実行が止まった。
  
 
==よくある使用例==
 
==よくある使用例==
40行目: 36行目:
 
[変数 v] を (1) にする
 
[変数 v] を (1) にする
 
([数リスト v] の長さ::list) 回繰り返す
 
([数リスト v] の長さ::list) 回繰り返す
(変数) 番目([数リスト v])を((((変数) 番目([数リスト v]) / (2))を四捨五入) で置き換える
+
[数リスト v] (変数) 番目を((([数リスト v] の (変数) 番目) / (2))を四捨五入) で置き換える
 
</scratchblocks>
 
</scratchblocks>
  
52行目: 48行目:
 
{{メイン|代用ブロック一覧}}
 
{{メイン|代用ブロック一覧}}
 
このブロックの動作は、次のコードで再現できる:
 
このブロックの動作は、次のコードで再現できる:
 
<!-- よくよく見ていると、下記のスクリプト、どうも動作があやしいので(負数の扱いはどこにいった?など)コメントアウトしておきます。動作確認できればはずしてください。
 
  
 
<scratchblocks>
 
<scratchblocks>
(すべて v) 番目を [わられる数リスト v] から削除する//準備
+
もし <(b) < [0]> なら
(すべて v) 番目を [商リスト v] から削除する
+
[結果 v] を ((-1) * ((a) * (((-1) * (((-1) * (b)) [ln v]::operators)) [e^ v]::operators))) にする
[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] を ((a) * (((-1) * ((b) [ln v]::operators)) [e^ v]::operators)) にする
  <((カウンター) 番目\((わられる数)\)の文字) = [.]>  まで繰り返す
 
      [カウンター 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
 
end
[.] を (([商リスト v] の長さ) - (8)) 番目に挿入する([商リスト v])
 
<<<((最後 v) 番目([商リスト v])) = [.] > または <<<((最後 v) 番目([商リスト v])) = [0]> かつ <((商リスト) を四捨五入) = (商リスト::list)>> かつ <[商リスト v] に [.] が含まれる>>> ではない> まで繰り返す
 
  (最後 v) 番目を [商リスト v] から削除する
 
<<<((1 v) 番目([商リスト v])) = [0]> または <((2 v) 番目([商リスト v])) = [.]>> ではない> まで繰り返す
 
  (1 v) 番目を [商リスト v] から削除する
 
 
</scratchblocks>
 
</scratchblocks>
  
このスクリプトを実行すると、「商リスト」に求める商(答え)が入る。
+
ゼロ除算の扱いは上に書かれた通り。
 
 
もうすこしシンプルな代用コードとしては次のものが考えられる:
 
-->
 
 
 
<scratchblocks>
 
もし <(b) < (0)> なら
 
[結果 v] を (((a) * ([e^ v]\(((-1) * ([ln v]\(((-1) * (b))\)))::operators)) * (-1)) にする
 
でなければ
 
[結果 v] を ((a) * ([e^ v]\(((-1) * ([ln v]\((b)\)))::operators)) にする
 
end
 
</scratchblocks>
 
 
 
このスクリプトは、0で割ろうとしたときに次の値を返す。
 
 
 
・1/0 が「Infinity」を返す (元のブロックは、オフラインエディターではエラーになりスクリプトが停止する)
 
 
 
・-1/0 が「-Infinity」を返す(同上)
 
 
 
・0/0 が 「Error!」を返す。(元のブロックは、オフラインエディターではスクリプトが停止する)
 
  
 
'''このコードのしくみ'''
 
'''このコードのしくみ'''
163行目: 91行目:
  
 
負の数の対数は存在しないため、コードの前半(「もし」〜部分)では、bを正の数として扱い、最後に符号を反転している。
 
負の数の対数は存在しないため、コードの前半(「もし」〜部分)では、bを正の数として扱い、最後に符号を反転している。
 
Scratchではln 0が「-infinity」 (負の無限大) を返すため、このコードを使えば0による除算を行ってもエラーが発生しない。
 
 
値という面で、元のブロックにもっとも近い動作をする代替コードは次のとおりである。このコードは0による除算が発生すると、「Error!」を返す。
 
 
<scratchblocks>
 
(((b) * ([e^ v]\(((-1) * ([ln v]\(([絶対値 v]\((b)\)::operators)\)))\)::operators)) * ((a) * ([e^ v] \(((-1) * ([ln v]\(([絶対値 v]\((a)\)::operators)\)))\)::operators)))</scratchblocks>
 
  
 
==関連項目==
 
==関連項目==

2021年4月10日 (土) 02:16時点における最新版

このきじは ひらがなのページがありません。ごめんなさい。編集者向け:作成する
() / ()
() / ()
カテゴリ 演算
タイプ

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

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

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

ゼロ除算

割る数を±0に指定したときは、Scratch 2.0以降では、以下の値が返される:

  • 両方の引数の符号が一致するとき(例: 1/0, -1/-0) Infinity(正の無限大)
  • 両方の引数の符号が一致しないとき(例: -1/0, 1/-0) -Infinity(負の無限大)
  • 一つ目の引数が±0であるとき (例: 0/0, -0/0) NaN(非数)

Scratch 1.4以下では、スクリプトエラーが発生し、スクリプトの実行が止まった。

よくある使用例

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

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


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

別のブロックによる表現

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

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

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

ゼロ除算の扱いは上に書かれた通り。

このコードのしくみ

このコードのしくみを確認しておこう。 「でなければ」以降を数式で書くと次のとおり(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を正の数として扱い、最後に符号を反転している。

関連項目

Cookieは私達のサービスを提供するのに役立ちます。このサービスを使用することにより、お客様はCookieの使用に同意するものとします。