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

小数(浮動小数点数)から分数へ近似的に変換するツール

>> Webページ上でそのまま使えるJavaScript版はこちら

このプログラムは、小数を、適当な誤差の範囲内で、近い分数に変換するツールプログラムです。 なお、ここでの小数とは、関数電卓や計算機などでよく使われる形式の、いわゆる浮動小数点数を指します。

使用方法

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

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされるので、そのZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合は…

なお、Linux® 等をご使用で、右クリックメニューから展開するとファイル名が文字化けしてしまう場合は、 コマンドライン端末でZIPファイルのある場所まで cd した上で「 unzip -O cp932 ZIPファイル名 」で展開してみてください。

プログラムの起動

Microsoft® Windows® をご使用の場合

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

実行すると、最初にメモリー使用量や、(必要な場合のみ)Java®実行環境を自動で入手するか 等を尋ねられるので、適時答えると、プログラムが起動します。2回目以降はすぐに起動します。

※ ここで入手したJava®実行環境は、ZIPファイルを展開した中の「 jre 」フォルダ内にダウンロードされ、このプログラムの実行のみに使用されます。PC全体に影響する形でインストールされる事はありません。

Linux® 等やその他のOSをご使用の場合

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

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

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

起動後の操作方法

起動すると、まず変換したい値を尋ねられます。ここで分数に変換したい小数の値を入力してください。 Ctrlキー と V キーの同時押しで、貼り付けができます。 たとえば、21.333333333333 などを入力してみてください( 64/3 の値です )。

小数入力画面

続いて、分母の上限を尋ねられます。 変換結果は、ここで指定した範囲から、変換対象の小数値に近い分数の値を片っ端から求めて、 比較する事によって探されます。 普通は 10000 程度でいいと思います。あまり広い範囲から探して、123456789/1000000000 のような強引な結果が得られても微妙なので…

探索範囲入力画面

最後に、入力された小数と、結果の分数との間に、許容できる誤差の範囲を尋ねられます。 指定した誤差の範囲内に収まる分数が、変換結果として表示されます。

誤差範囲画面

入力が終わると、分数の探索が始まり、結果が表示されます。 この場合の例では 64 / 3 が得られます。

結果出力画面

なお同時に、その分数を浮動小数点数で実際に近似した値も表示されます(上図参照)。 あくまで近似的な浮動小数点数であるため、末尾に丸め誤差や桁落ち誤差を含む場合がありますが、 妥当性判断の参考にしてください。

背景や処理内容など

小数を分数に直したい…

例えば、表計算ソフトのセルとか、数値計算のパラメータとかに、 パッと見た感じではでたらめな小数が突然書いてあって、 「この値は確か、何かの整数同士で割り算した(分数の)値だったと思うけれど、 メモっていなかったので忘れてしまった… もとの分数が何だったか知りたい ! 」 という場合、手計算でもとの分数を求めるのは結構面倒です。

筆者が個人的に、つい最近まさにそういった必要に迫られたため、自動でいい感じの分数を探してくれるよう、 即席で書いたのがこのプログラムです。

処理内容

即席なので処理内容も結構単純で、 「与えられた小数に近そうな分数を片っ端から探し、 その値を求めて、誤差が一定範囲内であれば正解と見なして表示する」 という感じの処理になっています。

本当はもうちょっと数学的にうまいことやれるのでは、と思いますが、 とりあえず筆者は個人的にはもう目的を達成できたので、 そのまま公開します。 もしいつか、莫大な大きさの分母・分子を持つ分数でも探す必要が生じた場合などは、また手を入れるかもしません。

「近くなりそうな分数」の範囲

上で「近くなりそうな分数を探す」と言いましたが、 人間だと勘で適当にそれっぽいのを試すという事ができても、コンピュータに勘はないので、 この点に少し補足を加えておきます。

一番単純な探し方として、例えば「分母と分子それぞれ 1 から 100万 まで、 全ての組み合わせから探す」みたいなものが思い浮かびますが、 それだと総数は100万の2乗で1兆通りなったりして、探す範囲がやや大変な事になり、 入力から出力までのレスポンスが遅れて地味に鬱陶しいです。 その1兆個の分数の中には、比べるまでもなく大きすぎたり、小さすぎたりするやつが大半で、 目的の小数に近いやつはごくごく一部です。

さすがそれだと効率が悪すぎるので、少し探す範囲を絞り込みます。 分数に直したい小数の値を f としましょう。 そして、ある分母の整数 i が与えられたとして、分子を探す範囲を絞り込みます。 まず、当たり前の事ですが「 f*i / i = f 」となりますね。 という事は、f*i に近い整数を分子にすれば、分数の値は f に近いはずです。

f*i の端数を切り捨てて整数にしたものを j1 としましょう。これは f*i 以下の値であるため、 分数 j1 / i は f 以下の値となります。

また、整数化で切り捨てた端数は1以下なので、j1 + 1 を新たに j2 とすると、 これは f*i より大きい値となり、従って分数 j2 / i は f より大きい値となります。j1の逆ですね。

j1 と j2 は隣接する整数なので、挟み撃ち的な感じで、結局はこの2つを分子として採用すれば、 どちらかが最も近い分数値を与えてくれます。 つまり、ある分母 i の値について、分子は f*i と f*i+1 の2通りだけ採用すれば、 近似値を探す範囲としては十分なわけです。 あとは、分母 i をひたすら増やしていって、 誤差が規定範囲内に収まる分数を探せば OK です。

コード解説

実際のプログラムのコード内容について簡単に説明します。 このプログラムのコードはVCSSLで記述されています。 今回の内容は単純なので、大体C言語っぽい感覚で読める感じになっていると思います。

なお、JavaScript版のコードもVCSSL版とほとんど同じなので、ここではとりあえずVCSSL版のコードで解説します。 JavaScript版のコードはJavaScript版のページに掲載しています。

コード全体

まずは、コード全体を見てみましょう。30行程度の短いコードです。

以上です。流れとしては、先頭あたりでユーザーから近似対象の小数値やパラメータを入力してもらい、 真ん中あたりでループを回して近い分数を探し、見つかれば出力してそのままプログラムを終了する感じです。 良い分数が見つからなければ、ループを抜けて末尾まで下りてきて「見つかりませんでした」と言って終了、 といった具合です。

以下では、各部についてもう少し見てみます。

先頭部分

まず先頭部分です。

先頭の「 coding Shift_JIS; 」では、プログラムの文字コードを明示しています( UTF-8も可 )。 必須ではありませんが、書いておくと文字化けするのを防げます。

「 import Math; 」の部分は、数学関数を扱うためのライブラリ「 Math 」を読み込んでいます。 誤差の絶対値を求める際に abs 関数を使うので必要です。

ユーザー入力

続いて、ユーザーに近似対象の小数値やパラメータを入力してもらう部分です。

input関数は、ダイアログを表示して、ユーザーに値を入力してもらうための関数です。 input関数の戻り値は string ですが、float や int で受け取っているので、代入時に暗黙的に変換されます。

近い分数を探す

続いて中核部分です。分母 i を増やしながら、近似対象の小数 f に近い分数を探します。

処理内容の解説でも述べた通り、それぞれの分母 i について、分子は f*i と f*i+1 の2通りから探せば十分です。

誤差が規定範囲内に収まるものが見つかった場合は、出力してそのまま exit でプログラムの実行を終了します。

見つからなかった場合の処理

見つからなかった場合は、上のループを抜けて、見つからなかった旨を告げて実行終了します。

詳しいVCSSLのプログラミングガイド(無料)はこちらへ!

上記のコードはプログラミング言語VCSSLで記述されており、VCSSLのプログラミングガイドは下記で無料公開しています。 上記のコードを改造したい方や、新しいコードを書いてみたい方はぜひご活用ください!

スタートアップガイド( プログラミングがはじめての方向け )
プログラミングの入門書に相当する内容です。プログラミングが初めての方はこちらがおすすめです。
即席ガイド( C系言語ユーザー向け )
C言語や C++ などのC系の言語を扱われている方が、即席でVCSSLを扱うための簡易ガイドです。
文法ガイド
VCSSLの文法や基本的な機能を淡々とまとめた、リファレンスマニュアル的な位置づけのガイドです。
GUI開発ガイド
ボタンや入力項目などのGUI部品が並ぶ、画面を備えたVCSSLプログラムを開発するためのガイドです。
2DCG開発ガイド
画面上や画像ファイルなどに、2次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
3DCG開発ガイド
画面上や画像ファイルなどに、3次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
標準ライブラリ 仕様書
コード内で呼び出される関数は、大半が標準ライブラリのものです。その詳細仕様を掲載しています。

ライセンス

このVCSSLコード( 拡張子が「.vcssl」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。

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

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

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


スポンサーリンク



[ 前へ | 目次 | 次へ ]
入力された数式を積分して値とグラフを表示するツール

画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。
シンプソン法による数値積分

積分の値を数値的に求めます。台形法よりも高精度な方法として、被積分関数を微小区間内で二次関数近似して求めた面積を足しあげる、シンプソン法を使用します。
台形法(台形近似)による数値積分

積分の値を数値的に求めます。長方形近似よりも高精度な方法として、台形で近似した微小領域を足しあげる方法を使用します。
矩形法(長方形近似)による数値積分

積分の値を数値的に求めます。長方形の短冊(矩形)で近似した微小領域を足しあげる、最も単純な方法を使用します。
小数(浮動小数点数)から分数へ近似的に変換するツール

小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換してくれるツールプログラムです。
円周率1万桁の計算(ガウス=ルジャンドル法)

ガウス=ルジャンドル法により、円周率を1万桁まで計算するプログラムです。
試し割り法による素数判定ツール

試し割り法を用いて、素数判定を行ってくれる簡易ツールです。
スポンサーリンク

この階層の目次
[ 前へ | 目次 | 次へ ]
入力された数式を積分して値とグラフを表示するツール

画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。
シンプソン法による数値積分

積分の値を数値的に求めます。台形法よりも高精度な方法として、被積分関数を微小区間内で二次関数近似して求めた面積を足しあげる、シンプソン法を使用します。
台形法(台形近似)による数値積分

積分の値を数値的に求めます。長方形近似よりも高精度な方法として、台形で近似した微小領域を足しあげる方法を使用します。
矩形法(長方形近似)による数値積分

積分の値を数値的に求めます。長方形の短冊(矩形)で近似した微小領域を足しあげる、最も単純な方法を使用します。
小数(浮動小数点数)から分数へ近似的に変換するツール

小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換してくれるツールプログラムです。
円周率1万桁の計算(ガウス=ルジャンドル法)

ガウス=ルジャンドル法により、円周率を1万桁まで計算するプログラムです。
試し割り法による素数判定ツール

試し割り法を用いて、素数判定を行ってくれる簡易ツールです。
お知らせ

リニアンプロセッサー nano の先行開発版やソースコードリポジトリを公開
2019年04月16日 - オープンソースで開発中の小型プログラム関数電卓ソフト、「 リニアンプロセッサー nano 」の先行開発版やソースコードリポジトリを公開しました。概要と使用方法、ビルド方法などについて解説します。

各ソフトウェアの最新版を一括でリリース、OpenJDKのJava実行環境(JRE)に対応
2019年03月06日 - RINEARNでは3月6日に、主要なソフトウェアの最新版を一括でリリースしました。今回のアップデートには、以前お知らせした、OpenJDKで生成したJREへの対応が含まれています。その概要等をお知らせします。

次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます
2019年02月12日 - VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。その詳細と、使用コードでの対応方法について解説します。

新着
画像を任意サイズに拡大・縮小する簡易ツール(複数ファイル一括処理版)

フォルダ内にある全ての画像ファイルを開き、任意のサイズに拡大・縮小して、別のフォルダに保存する簡易ツールです。
2019年03月29日
画像を任意サイズに拡大・縮小する簡易ツール

画像ファイルを開き、任意のサイズに拡大・縮小して、別名で保存する簡易ツールです。
2019年03月28日
画像の矩形(四角形)領域を切り抜く簡易ツール(複数ファイル一括処理版)

フォルダ内にある全ての画像ファイルを開き、その中の矩形(四角形)領域を切り抜いて、別のフォルダに保存する簡易ツールです。
2019年03月15日
画像の矩形(四角形)領域を切り抜く簡易ツール

画像ファイルを開き、その中の矩形(四角形)領域を切り抜いて保存する簡易ツールです。
2019年03月14日
入力された数式を積分して値とグラフを表示するツール

画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。
2019年01月20日
開発元Twitterアカウント

スポンサーリンク