ラベル 面積 の投稿を表示しています。 すべての投稿を表示
ラベル 面積 の投稿を表示しています。 すべての投稿を表示

2015年6月28日日曜日

集計表~用途別面積表

階別・用途別の面積表

前回は、住戸タイプの各階別の分布を集計表を使って調べましたが、今回は同様に面積を部屋用途ごと、階ごとに集計してみましょう。
階別・用途別に面積表を作成する

面積用途を作成する

まず、前回の住戸タイプ同様、面積用途を表す集計キーを作成します。

(1) [表示]-[集計]-[集計表/数量]
(2) カテゴリで「部屋」、集計キーを選択し、下の図のように設定します。
集計キー 「面積用途」 を作成
(3) [パラメーターを追加]を選択し、「面積用途番号」を作成します。前回同様、このパラメーターの型は整数にすることが重要です。
パラメータータイプは「整数」

(4)フィールドタブと並べ替えタブは以下のようになります。
面積番号を上位にする

面積番号で並べ替える

面積用途

[データ行を挿入]をクリックして、使用する面積用途を追加します。
面積用途を追加

カラースキーム

次に平面図で面積用途を各部屋に設定しますが、このとカラースキームを使うと便利です。平面図のビューを開き、ビューのプロパティ[カラースキーム]をクリックします。
カラースキームをクリック
カテゴリから「部屋」を選択し、リストからなにかを選んで複製し、名前をつけます。
既存を複製して名前をつける

タイトルを設定し、色から「面積用途」を選択します。面積用途がリストされるので、必要に応じて色を変えてOK。
面積用途の色を編集する

平面図が面積用途ごとに色分けされます。部屋を選択し、プロパティ「面積用途」を変更します。
平面図を色で確認しながら面積用途を設定する
このときビュープロパティで「カラースキームの場所」を「前景」にしておけば、色が階段などで白抜きになることがありません。

面積表の作成

各部屋に面積用途が設定できたら、集計表を作成します。前回の応用ですので、よく注意して設定してみてください。

まず、[表示]-[集計]-[集計表/数量]で集計表を作成します。カテゴリは部屋を選び、今度はそのままOKで次に進みます。

使用可能なフィールドからまず、「レベル」「面積」「面積用途番号」を選択します。

次に、「計算値」を押してください。前回を思い出してください。ここではif文を使って条件を設定するのですが、ちょっと注意が必要です。面積を求めるのですから以下のように設定します。
タイプは「面積」、計算式は「if(面積用途番号=1,面積,0)」
この計算式は、「もし、部屋の"面積用途番号"が1ならば、その部屋の"面積"を返し、そうでなければ0を返しなさい」という意味です。

同様にほかの計算式も以下のように設定します。



最後のフィールドとして、合計値を設定します。

並べ替えタブではレベルごとに並べ替えられるように、次のように設定します。
並べ替えタブの設定
書式では二つ重要なポイントがあります。
面積と面積用途番号を「非表示」にする
専用・共用・便所・設備・合計の位置合わせを右に、合計を計算にチェックを入れる
以上の設定で以下のような集計表が完成します。
階別・用途別面積表

2014年4月19日土曜日

コンピューターは小数の計算が苦手

桁処理の意外な結果

前回の面積表で、「小数点以下第6位」を切り捨てにしてみたところ、次のような結果になりました。
計算間違い?
7.12560000007.1256になるべきですが、答えは7.1255になっています。その次の値もおかしいですね。なぜこのようなことになるのでしょうか?

表示と本当の数字は違う

この面積、実は内部の値として

7.1255999999994㎡

の場合があります。これが丸め処理されて、表示値は「7.1256」となっていたというわけです。確かにこの値を小数点以下第6位で切捨てすれば、7.1255になるのは当然です。表示されている値はすでに「丸め」処理が行われた数字なのです。

しかし、なぜこのような端数が生じるのでしょうか?

コンピューターでは数字を2進数で保持します。ところがほとんどの小数は2進数で正確に表すことができません。これは0または1(=2進数)を基礎とした計算を基本とするコンピューターの宿命なのです。

エクセルでも誤差はある

エクセルを開いて、セルに

=0.3-0.2-0.1

と打ち込みます。当然「0」となります。ところが

=0.3-0.2-0.1-0

エクセルでも誤差が発生する

と打ち込むと、「-2.77556E-17」と表示されます。これが「誤差」です。皆さんが全幅の信頼を置いているエクセルでさえ、誤差は発生するのです。

コンピューターの倍精度浮動小数点と呼ばれる値には長年誤差が付きまとっています。金融界ではこのような誤差は致命的なので、この誤差を回避する様々な手法が開発されています。

誤差を回避するには

こうした誤差を回避するために、一般に丸め処理(=誤差修正)が行われていますが、これは表示上だけであり、実際に保持されている数字は変わらないので、このような問題が生じます。これを回避するにはどうすればいいでしょうか?方法は二つあります。

  • 丸め処理を複数回行う
  • 微小値を加える

前者の方法を用いて、前回の手法をすこし改造してみます。最初の面積を実数化した後に、面積値を一旦小数点以下第8位あたりで四捨五入し、表示値=内部保持値の状態を作り出したうえで、任意の桁で処理を行えばいいでしょう。

前回の面積表と同様、面積値を実数化した後に、小数点以下第8位で四捨五入するため10000000倍します。


計算式:(面積 / 1 m²) * 10000000
この時点で一部誤差が発生していることが確認できます。次にこれを「round(x)」関数を用いて四捨五入します。

計算式:round(実数×10000000)

結果を1000で除して、切捨て処理をします。

四捨五入÷1000の計算式:四捨五入/1000
切捨の計算式:rounddown(四捨五入÷1000)
最後に10000で割って、面積化の手順を踏めば誤差を修正した面積を取得できます。

切捨処理÷10000の計算式:切捨処理/10000
結果の計算式:切捨処理÷10000 * 1 m²

まとめると次のような式となります。
(rounddown(round((面積 / 1 m²) * 10000000) / 1000) / 10000) * 1 m²

誤差を修正

コンピューターの演算は有限桁数で行っているため、必ず誤差が発生します。

エクセル 小数 誤差

で検索してみると多数の事例や回避方法を見つけることができますのでご確認ください。

一般に皆さんがコンピューター上で見ている少数は、ほとんどすべての場合ある程度の桁で「丸め処理」が行われた表示上の数字です。コンピューターが内部に保持している値はもっと複雑な値であることをお分かりいただけたでしょうか?

2014年4月13日日曜日

面積の桁処理方法

面積を切り捨てる方法

Revitの数値の表示は「丸め」という手法が用いられますが、明快に小数点以下第○位を切り捨てることは可能でしょうか?集計表を用いて試してみましょう。Revitに付属しているサンプルファイル「rac_basic_sample_project.rvt」で部屋面積をレベル順にならべた集計表を作成しました。
面積は「0.000000001」で丸めています。
面積表

面積を実数化する

面積を小数点以下第三位で切り捨てるには、次の手順を実行します。

  1. 面積を実数にする
  2. 実数を100倍する。
  3. 最も近いその値以下の整数に丸める
  4. 3を100で割って実数に戻す
多少面倒ですが、順を追って説明します。Revitは属性値の型にシビアなので面積のままでは3の切捨て処理ができないので一旦実数にします。実数にするのは簡単で、計算式のパラメーターを追加して面積を1で割るだけです。


面積/1で実数化される

100倍する

小数点以下第3位を切り捨てるために、小数点以下第2位を1の位にします。そのため値を100倍します。
切捨て前の準備として100倍する

切り捨てる

切り捨てるには次の関数を使用します。

rounddown(x)

この関数は、x以下でxに最も小さい整数を返します。

実数を100倍した値を切り捨てる

切り上げる場合は

roundup(x)

を使います。

100で割る

桁処理のために100倍したので100で割って元に戻します。

100で割って桁を元に戻す

面積に戻す

計算式のフィールドは表示形式が設定できませんが、面積のフィールドにすれば形式を設定することができます。それには1を掛けるだけです。

タイプを面積にして1を掛けると面積化できる

タイプを面積にすると形式の設定が可能
無事に切捨て処理を行うことができました。合計値もそれぞれの切り捨てた値を合計した値になっています。

まとめ

ここまでは手順を追って説明したため、列が増えてしまいましたが、これらをまとめることもできます。フィールドの計算式は次のようになります。

((rounddown(((面積 / 1 m²) * 100))) / 100) * 1 m²

集計表は次のようになります。
面積を小数点以下第三位で切り捨てた面積表
合計値が桁処理前と後で異なっています。これは合計値が合計値を桁処理したのではなく、きちんと桁処理した数値を合計しているためです。