[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

[公式ガイドサンプル] 割り算の結果や、余りなどを画面に表示する

このプログラムは、 「 VCSSLスタートアップガイド 」 の 「 式と計算、データ型 」 の回に登場するサンプルコードです。 ここでは、そのサンプルコードを実行環境ごとダウンロードして、実際に実行してみる事ができます。 プログラミングガイド的な詳しい解説については、上記ページをご参照ください。

スポンサーリンク


使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。

Windows をご使用の方は、ここでまずZIPファイルを右クリックし、「プロパティ」を選んで開かれる画面で、 下の方にあるセキュリティ項目の「許可する」にチェックを入れて「OK」で閉じてください。 これを行わないと、ZIP展開やソフト起動時に、警告メッセージが出て展開完了/起動できない場合があります。

その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…

プログラムの起動

Windows をご使用の場合

上記の通りにZIPファイルを展開したフォルダ内にある、 「 VCSSL__ダブルクリックでプログラム実行.bat(種類はバッチファイル) 」をダブルクリック実行してください。 もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。

正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。

» うまく起動できずにエラーになってしまう場合は…

Linux 等をご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後

起動すると、黒い画面に値が表示されます:

2
4
2.5
2.5

これら値は、コード内(すぐ後で解説します)で、各行の「 println(...); 」のカッコ内にそれぞれ記述した式:

20 / 8
20 % 8
20.0 / 8.0
20 / 8.0

が計算された結果の値になっています。

コード解説

このプログラムのコードはVCSSLで記述されています。 このプログラムはサンプルコードですので、 ぜひ式の内容を書きかえて、色々な値を計算してみてください。

実際に内容を書き変える際には、 プログラムのコード「 DivisionAndRemainder.vcssl 」をテキストエディタで開いて編集してください。 VCSSLはスクリプト言語なので、コンパイラなどの別ソフトは不要で、コードを書き換えるだけでOKです。 C系の単純な文法の言語なので、C言語などに触れた事のある方なら簡単に読み書きできると思います。

それでは実際に、プログラムのコード内容を見てみましょう:

たった5行の短いコードですね。内容については、 スタートアップガイドの「式と計算」の回でも説明していますので、必要に応じて併せてご参照ください。 このコードは、その記事に登場するサンプルコードです。

なお、今回の内容は、前回の内容の続きになっています。 前回は、かけ算と割り算を行うサンプルコードを紹介しつつ、足し算・引き算との優先度(計算順序)の違いなどの注意点を説明しました。 必要に応じて、記事の記事も併せてご参照ください:

では、今回のコード内容を一行ずつ見ていきましょう。

println 関数について

前回も説明しましたが、まず各行の計算式を囲っている println(...) の部分について触れておきましょう。 これは、カッコ内の「 ... 」の所に書いた内容を画面に表示して 改行する 機能を持った関数です。 今回のように、複数の結果を表示する際などに、1行につき1つの結果を表示するのに便利です。

なお、関数名の末尾に「ln」を付けずに print(...) とすると、繰り返し呼んだ際に、改行されずに1行に続けて表示されます。println 関数は、それに自動改行機能が付いた派生版です。

print / println 関数の働きのイメージを図にすると、以下のように「 カッコ内に値や式を投げ込んで、それを表示してもらう 」という感じです。

print / println 関数の働きのイメージ

整数同士の割り算

それでは、最初の行についてです。

前回も登場した通り、「 / 」記号は、多くのプログラミング言語では「割り算の記号」として使われていて、VCSSLでも同様です。「÷」の代わりに「 / 」と書く、という具合です。

先に述べた println 関数の説明と併せると、つまるところ上の行は「 20 割る 8 」を計算して、それを画面上に一行で表示する、といった処理になります。 従って、結果の最初の行に、その答えが

2

と表示されたわけですね。

整数同士の割り算の、大きな落とし穴

さて、ここで結構多くの人が、

「 えっ、答えって2.5じゃないの…? 」

と思ったかもしれません。

というか、普通そう思いますよね。私たちが「 20 割る 8 は? 」って聞かれたら「 2.5 」って答えるでしょうし、電卓を叩いても「 2.5 」って出ますし。「 2 」と答えたら計算ミス扱いで怒られそうで。 「 ちょっと、そんな小学校レベルの計算でミスしないでよ! 」って。

でも、逆に小学校時代を思い出してみてください。 小学校ではじめて割り算を習ったあたりの頃って、確かまだ小数点付きの計算とか習ってなかったので、「 20 ÷ 8 = 」って問題が出たら

2 あまり 4

とか答えませんでしたか? きっと身に覚えがありますよね。うわっ、なつかしっ!って感じで。

そう、そうなんです。比較的多くのプログラミング言語(※)では、整数同士で割り算をすると、この「 2 あまり 4 」とかにおける「 2 」に相当する部分が求まるんです。 つまり、整数同士の割り算の結果は整数になって、小数点は付きません。この独特の割り算は、一般に整数除算などと呼ばれています。なお、小数点付きの値を得る方法については、この記事の後半でちゃんと扱います。

※ C系の文法かつ静的型付けの言語では、特にこのルールを採用しているものが多く(C言語自身も)、気を付ける必要があります。逆に動的型付けの言語では、割り算の結果が小数部付きになるもの結構存在します。

例えば Python3 などは、「 / 」での割り算結果は小数部付きになって、整数の結果を得たい場合は「 // 」記号を使う、といった具合になっています( Python2 の頃は違い、整数同士の「 / 」の結果は普通に整数でした )。

ただ、静的/動的型付けだから必ずこうと決まっているわけではなく、結局は個々の言語によりけりです。

「 なんてややこしい、普通 20 ÷ 8 は 2.5 になると思うでしょ、それが 2 になるとか、使う時にミスしまくりでしょ 」と思ったかもしれません。 実際そうで、恐らく多くの人が、普通は「 何 あまり 何 」とか存在そのものをほぼ忘れているので、この挙動はプログラミング入門時に非常によく落っこちる落とし穴の一つになっています。

この種のミスは、基本的には慣れでカバーできますが、普段とは別の(割り算の挙動が違う)言語を使う際は、逆に慣れに起因するミスが生じるので要注意です。

整数同士の割り算の、余りを求める「 % 」(剰余演算)

さて、序盤が長くなってしまいましたが、次の行です。

ここで使われている「 % 」記号は、先の例での「 2 あまり 4 」とかにおける「 4 」に相当する部分(剰余)を求める記号です。

なので上の処理では、『 「 20 割る 8 」で整数の答えを求めた場合の、余り 』が求まり、それが結果の二行目

4

として表示されたわけです。要するに『 割り算の「 / 」を「 % 」に変えれば、その割り算での余りが求まる 』と覚えればいいかもしれません。

余りも関わる、整数同士の割り算での、もう一つの落とし穴(負の剰余問題)

さて、整数同士の割り算には、実はもう一つ大きな落とし穴があります。それには、上で述べた「余りの計算(剰余演算)」も大きく関連しています。 具体的には、一般に負の剰余などと呼ばれる問題です。

ただ、この問題の根っこの部分は、ここで短く&わかりやすくまとめるのは少し難しいため、「 負の剰余 プログラミング 」などとWeb検索してみてください。この節で短くまとめるよりも、ずっと丁寧に解説されているサイトがたくさんあります。

で、問題点を要約すると:

  • 負の数を含む整数の割り算( -20 / 8 など )の値や、その余りの値が、解釈により複数通りあり得る
  • 各プログラミング言語によって、どっち派の解釈の値が求まるかが非常にブレブレ
  • 多くの言語設計で多少なりとも意識される「 C言語 」でさえも、C99という世代の規格より前は、どっちの解釈をすべきか決まっていなかった

という具合です。これは、慣れでカバーというよりは、もう少し危ない問題です。 個人的には、下手に慣れて活用してしまうよりも、負の剰余そのものを避けるクセを付けた方が無難かもしれないと思います。 行いたい計算の意味を踏まえて、正の値を求めて、最後に符号を補正する、等です。

とは言いつつも、整数同士の割り算や剰余演算って、大体は高速に回るループの中で登場するので、余分な処理は極力行いたくない事も多いものですよね…  その場合は、とにかく気を付けるしかないかもしれません。

小数点付きの値を求めるには…

ここまでは、整数の範囲で割り算を行ってきましたが、ここからは小数点付きの値を求めます。

という事で、次の行を見てみましょう:

結果は:

2.5

この通り、普通の人が「 20 ÷ 8 」の答えとして期待する通り、小数点付きの値が求まりましたね。

上の println のカッコ内に書いた計算式は:

20.0 / 8.0

です。一方、最初に扱った、整数の答えが得られた計算式は:

20 / 8

でした。で、両者で何が違うかというと:

数値に小数点が付いているかどうか

です。つまり、両者を比べて何が言いたいかというと、以下の2点です:

  • 小数点付きの数値で割り算をすると、小数点付きの結果が求まる
  • 整数の数値で割り算をすると、整数の結果が求まる(整数除算になる)

ややこしいですよね。だって「 8 」も「 8.0 」も、算数や数学では同じ数値です。それなのに、多くのプログラミング言語では、別のものとして区別して扱われるわけです。実際、いまの場合は割り算の振る舞いが変わりましたね。

数学的には同じ数でも、小数点の有無でデータ型が違う

上において、「 別のものとして区別して扱われる 」と書きましたが、その区別のカテゴリーには名前がついています。 具体的には「 データ型 」といって、略して単に「 型(かた)」と呼んだりします。

いまの例でいうと、8 とか 20 とかは、ストレートに「 整数 」という種類の型です。型の名前は言語によってまちまちで(典型例は int 等)、扱える長さ等について、さらに細かい区分があったりもします。

8.0 とか 20.0 とか 1.234 とかは「 浮動小数点数(ふどう-しょうすうてんすう) 」という種類の型です(型の名前は float や double など)。 後者はちょっと長ったらしいので、もっとシンプルに実数や小数と呼んだりもします(※後の枠内コメント参照)。

で、さっきも述べたように、数学的には同じ値のはずでも、プログラミングでは型によって振る舞いが違います。 なのでプログラムを書く時は、「 8.0 の『 .0 』とかあっても無くても一緒でしょ 」とか思わずに、頭の中できちんと区別する必要があります。「 こいつらは型が違うんだ 」と。図にすると↓のようなイメージです:

型のイメージ

プログラミングを始めたばかりなどで、このイメージがまだ頭にしみ込んでいない頃は、よく計算式で

(1 / 2) * (a + b)

みたいに分数の係数をそのままコードに書いてしまってバグります( 1 / 2 が整数除算で 0 になります)。 他にも、ここでは割愛しますが、扱える値の範囲や、誤差の乗り方なども違ってきます。 なので、型の違いに気を付けましょう。

※ ここは完全に(長い)脱線なので、必要に応じて読み飛ばしてください。

浮動小数点数(ふどう-しょうすうてんすう)の数値を短く呼ぶ際に、筆者はよく「小数」と呼ぶ派ですが、その呼称はしばしば議論の対象になりますます。 というのも、そもそも「小数」という言葉が指すもの自体に、「 小数点付きの数値における小数点以下の部分(いわゆる小数部)を指す 」という解釈や、「 絶対値が 1 よりも小さい数を指す 」という解釈もあったりして、実際由来が結構あいまいなためです。

そのため、「 例えば 8.25 のような数の全体を小数と呼ぶのは、誤用が一般に浸透したのではないか 」や、「 なので、小数ではなく実数と呼ぶほうがよい 」といった議論にしばしば出くわします。 確かに、いくつかのメジャーな言語の公式ドキュメント等ではよく、浮動小数点数の型の説明で「 real number なんとかかんとか〜 」と書かれていたりしていて、なので和訳でも「実数の型」とされる事がよくあります。

なので「実数」と呼べば、確実という点では確実です。恐らくどのような視点でも、間違いではないです。 それでも小数と呼ぶ派が結構居るのは、やっぱりイメージ的に「これは実数と呼ぶよりも小数のほうがしっくりくる」と感じる人がそこそこ居るからではないでしょうか。

筆者もそうで、「 実数 」というと、小数よりも抽象的な階層が一つ上のイメージを持っています。「 実数 = どういう表記法で表すかは置いておいて、とにかく数直線上の(実軸上の)任意の点に対応する数 」といった具合です。

そして、「 小数 = 実数を、小数点と数字の列を組み合わせた記法によって表したもの 」、といったイメージを持っています。 同じような存在として「 分数 = 実数を分母と分子という記法で表したもの 」もある、といった具合です。 小数も分数も、値のカテゴリー的に実数なのは実数なのですが、表記法まで規定されている感じのイメージです。

で、浮動小数点数の値は、「 実数を小数の記法で表現した値 」の一種なので、筆者にとっては「実数」と呼ぶとちょっとワイドな感じで、「小数」と略した方がしっくり来るわけです。 イメージの余白をちょっと切り詰めたような感じ、と言えばいいでしょうか。 なので VCSSL / Vnano 関連のドキュメント類では、浮動小数点数の略称は主に「小数」呼びで、しばしば補足的な意味で「小数(実数)」などを用いています。

まあ、「小数部(小数点より右)」と「整数部(小数点より左)」について話す際に、全体をひっくるめて「小数」と呼ぶとややこしい、というマイナス面は確かにあるのですが。 あと英語だと、小数を直訳すると decimal なんですが、プログラミングでは decimal はいわゆる十進小数を指すので、そっちでは呼び変えはしないほうが無難そう(素直に floating-point number とか使う)、というややこしさもあります。 このあたりは色々とトレードオフですね。

突然の脱線なのに、異様に長くなってしまいましたが、上のような議論が存在するという事についてはご留意ください。

整数と小数(実数)との間の割り算は?

さて、長くなりましたが、コードの最後の行です:

これは、整数と小数(実数)との間で割り算を行っていますね。結果がどうなるかというと:

2.5

このように、小数(実数)の値が求まります。計算式を「 8.0 / 20 」にしても同様です。 つまり、分母と分子のどちらか片方でも小数なら、小数の値が求まります。

他の節と比べるとあっさりしていますが、この処理で言いたいのはそれだけです。

おまけ: 変数の割り算の場合はどうする?

以上で、今回コードの内容については全て説明(脱線が8割ですが)し終えたのですが、最後に一つだけ、コード内には無い内容について補足しておきましょう。 それは、変数の割り算における対処についてです。例えば:

の例では、整数の変数 a, b を介して「 20 ÷ 8 」の計算を行っているので、結果は整数で「 2 」が求まります。

ここで小数点付きの結果を得たい場合、a や b の箇所に「 .0 」を付けたりしてもダメです。それができるのは、数値を直接書いている場合だけです。

じゃあ、整数の変数を、小数(実数)として扱って計算したい場合はどうするの? というと:

の print(...) 内の計算式のように、変数名の頭に「 (float) 」とか「 (double) 」とかを付けます。これをキャストと呼びます。結果は、ちゃんと「 2.5 」が求まります。

float や double は、浮動小数点数の型の名前で、一般には double の方が表現桁数(精度)が大きい型になっています。ただ、VCSSLでは両者は同じ(ただの別名)です。

以上、当初想定していたよりもだいぶ長い記事になってしまいましたが、割り算のコード解説でした。 読みづらくてすみません。でも、割り算って本当に色々と落とし穴なんですよね…

記事の著者

松井 文宏 - Fumihiro Matsui
RINEARN代表、VCSSL & Vnano やリニアングラフ3D/2D、その他 諸々を開発しています。

ライセンス

このVCSSL/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。

※ ただし、このコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。


スポンサーリンク



[ 前へ | 目次 | 次へ ]
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
[公式ガイドサンプル] 割り算の結果や、余りなどを画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。整数や小数(実数)における割り算結果や、整数の場合の余りを画面に表示します。
[公式ガイドサンプル] かけ算と割り算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。かけ算と割り算を行って、結果を画面に表示します。
[公式ガイドサンプル] 引き算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。引き算を行って、結果を画面に表示します。
[公式ガイドサンプル] 式を複数行にわたって書く

「VCSSLスタートアップガイド」内のサンプルコードです。足し算を行う式を、複数行にわたって記述します。
[公式ガイドサンプル] 足し算の結果を画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。足し算の結果を求めて、画面に表示します。
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(魔法陣形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元のメッシュグラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元のメッシュグラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(花形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、花の形の3次元曲面のグラフを描画します。
[公式ガイドサンプル] CSVファイルに書かれた数値データを、配列として読み込んで表示する

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルに記載された数値データを、読み込んで配列に格納してから、内容を画面に表示します
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元の線グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元の線グラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを丸めて書き出し、読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを、丸め処理を行った上で書き出し、さらにそれを読み込んで、2次元グラフを描画します。
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、2次元グラフを描画します。
[公式ガイドサンプル] CSVファイルを読み込んで2次元グラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルに記載されたデータを読み込み、2次元グラフを描画します。
この階層の目次
[ 前へ | 目次 | 次へ ]
お知らせ

関数電卓 RINPn をアップデート、折りたたみ可能なキーパネルを搭載
2022/11/11 - 関数電卓 RINPn のアップデート版を公開しました。画面デザインを少し見直し、今回から、1クリックで折りたたみ/展開が可能なキーパネルを搭載しました。詳細をご紹介します。

リニアングラフ3Dをアップデート、軸反転がリセットされるバグの修正など
2022/11/03 - リニアングラフ3Dのアップデート版をリリースしました。軸反転がリセットされるバグや、設定ファイル読み込み時に等高線の区間数が反映されないバグの修正を行いました。

各ソフトウェアのアップデートのお知らせ
2022/10/12 - リニアングラフ3Dなどの各ソフトウェアのアップデート版を、一括でリリースいたしました。各ソフトの更新内容をお知らせします。

新着
角度の「度」とラジアンとを相互変換し、図示もするツール

45度などの「度」の値と、ラジアンの値とを相互に変換できるツールです。対応する角度の図示もできます。
2022/11/22
[公式ガイドサンプル] 立体モデルを回転させるアニメーション

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、アニメーションで回転させ続けます
2022/11/18
[公式ガイドサンプル] 立体モデルを回転させる

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、指定した角度だけ回転させます。
2022/11/17
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
2022/10/31
[公式ガイドサンプル] 割り算の結果や、余りなどを画面に表示する

「VCSSLスタートアップガイド」内のサンプルコードです。整数や小数(実数)における割り算結果や、整数の場合の余りを画面に表示します。
2022/10/30
開発元Twitterアカウント