布団が俺を呼んでいる

丘山大一のぶろぐ

Firebird のお勉強 計算時の小数点以下の有効範囲

SQL上で計算した時の結果がどうにも理解できなくてはまりました。
しかし、同じことを考える人はいるもので。結論はStack overflow に出ています。

以下、ちょっと解説。

計算時の有効桁数具体例
Firebird の 計算時の小数点以下の有効桁数は、「計算に使用した型が持つ有効範囲」を足し合わせたものになります。
……と、こう書いても意味不明なので具体例。

SELECT cast (1/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000000000/999999999999 AS numeric(18,13)) FROM HOGE;
SELECT cast (1.000000/999999999999.000000 AS numeric(18,13)) FROM HOGE;
SELECT cast (1E0/999999999999 AS numeric(18,13)) FROM HOGE;

結果は、
0.0000000000000
0.0000000000010
0.0000000000010
0.0000000000010
となります。

1つ目は、分子・分母両方とも小数点以下が存在しません。そのため、計算時の有効桁数は「0 + 0 = 0」です。有効桁数が足りないので、結果表示時にnumeric(18,13)を指定しても、結果は「0.0000000000000」となります。
2つ目は、分子に小数点以下の桁数が存在しています。そのため、計算時の有効桁数は「12 + 0 = 12」です。
3つ目は、分子・分母両方に小数点以下が存在します。そのため、計算時の有効桁数は「6 + 6 = 12」です。
4つ目は、分子に「小数点以下を表示するための記号」である「E0」が指定されているため、計算時の有効桁数はdouble 型となるようです。

テーブルで確認してみる

簡単なテーブルを作成してみます。

CREATE TABLE HOGE(
    KEY_NO integer,
    VALUE_INT integer,
    VALUE_NUMERIC_SHORT numeric(18,1),
    VALUE_NUMERIC_LOMG numeric(18,13)
);
INSERT INTO HOGE VALUES(1,1,99999,99999);
SELECT cast (VALUE_INT /VALUE_NUMERIC_SHORT AS numeric(18,13)) FROM HOGE where KEY_NO = 1;
SELECT cast (VALUE_INT /VALUE_NUMERIC_LOMG AS numeric(18,13)) FROM HOGE where KEY_NO = 1;

結果はこうなります。
0.0000000000000
0.0000100001000

理屈は上記と一緒ですね。

無理矢理計算するなら、さらにCASTをかませるという手もなくはありません。

SELECT cast (VALUE_INT / (cast (VALUE_NUMERIC_SHORT AS numeric(18,13))) AS numeric(18,13)) FROM HOGE
where KEY_NO = 1;

こうすれば、
0.0000100001000
となります。


達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

新品価格
¥2,592から
(2016/8/14 21:47時点)

コメントを書く

布団が俺を呼んでいる | Continuum を試してみた

布団が俺を呼んでいる

丘山大一のぶろぐ

Continuum を試してみた

ただし変則的な構成で。

構成っ!!

・Nuans neo
・Actiontec ScreenBeam Mini2 Continuum
・サンワサプライ モバイルプロジェクター PRJ-3
・cheero Power Plus 10400mAh DANBOARD Version 大容量 モバイルバッテリー
 (通称ダンボーバッテリー)

なぜにそんな変な構成に?

プロジェクタに関しては、単純にHDMI接続できる手頃なモニタが無かったからです。
HDMI接続可能なものはPCに接続してあって外しづらいし、部屋にテレビは無いし。
モバイルバッテリーを使っているのは、モバイルプロジェクターを使うならモバイルバッテリーで動くかどうか確かめたいなーと思ったからです。

接続の仕方

簡単です。
まずプロジェクタとScreenBeam Mini2 を接続。
ScreenBeam Mini2 はダンボーの1Aの方に接続。
フツーに電源を入れます。
しばらくすると接続待ち受け状態になります。
今度は、Nuans neo を操作し、プリインストールアプリの中の「CONTINUUM」を起動。
あとは流れにそっていけば起動できます。
1Aで足りるかな?と思いましたが杞憂でした。
「もっさりしている」という記事をよく見ましたが、思いのほかサクサク。
ちょっとビックリしました。

あれ、フツーのMiracastでの投影は?

さて、ここまで書いておいてなんですが、個人的には Continuum は正直使う気がありませんw
なぜなら、なんぼPCのように使える、といっても、シングルモニタ環境で何かを生産する作業をしたくないからです。
普段使っているメインPCがマルチモニタの4枚環境。
会社でも3枚。
シングルモニタでは表示領域が狭くて、何か作る気にはなれません。(閲覧・表示だけならいいんですけどね)
今回はスクリーン投影しているので、まあ表示領域に関しては広いのですが、結局スクリーン投影しながら作業ってしにくいです。
と、いうわけで、色々アプリが制限されてしまうContinuum より、単純に Miracast による投影をしたかったわけです。
というわけで、さっそく……アレ?

やり方が分からない……

「デバイス」には画面出力に関する設定が無いし、
「接続」を選んじゃうとContinuum で繋がっちゃう……

ど、どうやればいいんだ……

というわけで、タイトルの「Continuum を試してみた」はできたのですが、フツーのMiracast 接続のやり方が分かりませんw
個人的にはコッチの方が問題。

モニタへの接続方法は他にもあった

正確にはPCへの接続、ですけど。
これは後日また書きます。

【正規代理店品】Actiontec ScreenBeam Mini2 Continuum(スクリーンビームミニ2 コンティニュアム) SBWD60MS01JP

新品価格
¥10,581から
(2016/3/9 22:24時点)

サンワサプライ モバイルプロジェクター PRJ-3

新品価格
¥42,800から
(2016/3/9 22:25時点)

コメントを書く