ラベル 桁処理 の投稿を表示しています。 すべての投稿を表示
ラベル 桁処理 の投稿を表示しています。 すべての投稿を表示

2018年9月8日土曜日

帖・坪表示と集計表の桁処理

帖数を表示するタグ

前回は面積を小数点以下第3位で切り捨てて表示するタグを作成しました。
面積を小数点以下第3位で切り捨てて表示するタグ
今度は帖数を部屋タグに表示してみます。前回同様小数点以下第3位で切り捨てて表示します。帖は各種係数はありますが、今回は1帖=1.62㎡として
1帖=面積(㎡)÷1.62
の計算式をタグに組み込みます。「帖」という単位はRevitには組み込まれていないので、タイプは「実数」を使用します。

作成手順

  1. 前回のタグを使用し、部屋面積の下に新たにラベルを作成します。
  2. 計算値ダイアログで以下の設定をします。
    • 名前:帖
    • 専門分野:共通
    • タイプ:実数
    • 計算式:rounddown((面積 / 1.62 / 1 m²) * 100) / 100
    • OK
      計算値ダイアログボックス
  3. ラベルを編集ダイアログのラベルパラメータの第1行で
    • 接頭表記:(
    • サンプル値:60.60
    • 末尾表記:帖)
      接頭表記:サンプル値:末尾表記
  4. [#]パラメータの単位書式を設定をクリックし
    • 既定の設定を使う:OFF
    • 単位:固定
    • 丸め:小数点以下の桁数 2
    • OK
      形式
  5. 保存する。
    完成した部屋タグ
プロジェクトにロードして試してみます。
小数点以下第3位で切り捨てて表示されている
この部屋の面積は実測で26.242㎡ですから帖数は
26.242(㎡)÷1.62=16.1987654(帖)
となります。部屋タグでは小数点以下第3位で切り捨てて「16.19帖」と表示されていることがわかります。

坪の場合も全く同じです。坪は
面積(㎡)×0.3025=坪
と考えて計算式は
rounddown((面積*0.3025/1)*100)/100
となります。

集計表で桁処理

ずいぶん前に集計表で面積のけた処理をする手法をご紹介しましたが、ちょっと復習しておきましょう。けた処理フィールドの計算式は

小数点以下第n位を切り捨てる場合
rounddown((面積/1)*10^(n-1))*1/ 10^(n-1)

となります。10^(n-1)は「10のn-1乗」という意味です。この式を使って集計表を作成すると次のようになります。
小数点以下第3位切り捨て
集計表の男子便所、女子便所などの面積に着目すると、部屋面積は小数点以下第3位が切り捨てられていることがわかります。
計算式は
部屋面積:rounddown((面積/1)*100)*1/100
帖   :rounddown((面積/1.62/1)*100)/100

となります。



2018年9月2日日曜日

計算式を含んだタグ

面積を切り捨てて表示する部屋タグを作る

Revitの数字の表示は「丸め」を行っています。今回は面積を小数点以下第3位で切り捨てて表示する部屋タグを作って、切り捨て、切り上げ、四捨五入の処理の仕方を学習してみましょう。使用する計算式は

  • rounddown(x)---x 以下の最も小さい自然数に丸める→切り捨て
  • roundup(x)------x 以上の最も大きな自然数に丸める→切り上げ
問題はround関数は自然数しか扱えないことです。そのままでは任意の桁を処理することはできません。一工夫必要です。

タグの作成

  1. [ファイル]>[新規作成]>[ファミリ]
  2. [注釈]フォルダ>[部屋タグ(メートル単位).rft]
  3. [作成]>[文字]>[ラベル]
  4. [プロパティウィンドゥ]で[タイプを編集]
  5. [名前を変更]をクリックし、名前を[Yu Gothic UI 1.3mm]に設定。
  6. 次の図のようにプロパティを設定する。
    Yu Gothic UI 1.3mm
  7. [複製]を押して名前を[Yu Gothic UI 1.5mm B]として、下の図のようにプロパティを設定する。
    Yu Gothic UI 1.5mm
  8. 参照面の交点付近をクリックして、1.5mmのラベルを配置する。
  9. [ラベルを編集]ダイアログボックスで、カテゴリパラメータから[名前]を選択して[→]ボタンを押してラベルパラメータに追加しOK。
    ラベルパラメータを追加
  10. ラベルの位置を調整する。
  11. 同様に、タイプ[Yu Gothic UI 1.3mm]で、名前の上方に「番号」のラベルを作成する。
    名前の上に番号
  12. 名前をつけて保存する。

面積を小数点以下第3位で切り捨てて表示する

面積を小数点以下第3位で切り捨てて、小数点以下第2位まで表示するラベルを作成します。面積のパラメータをそのまま使わず、計算式のラベルパラメータを作成します。
  1. [作成]>[文字]>[ラベル]
  2. 名前の下方をクリックしてラベルを配置。
  3. [fx]ボタンをクリック。
    計算されたパラメータをラベルに追加
  4. 計算値ダイアログボックスで次の操作を行う。
    • 名前を「部屋面積」
    • 専門分野を「共通」
    • タイプを「面積」
    • 計算式を「rounddown((面積 / 1 ) * 100) * 1  / 100」
    • [OK]
      計算値
  5. [サンプル値]に「100」、[末尾表記]に「㎡」とし、[#]ボタンを押す。
    パラメータの単位書式を編集
  6. 形式ダイアログボックスで次の操作を行う。
    • プロジェクト設定を使用のチェックをOFF
    • 丸めを「小数点以下の桁数 2」
    • 単位記号は「なし」
    • 末尾0を省略をOFF
    • 桁区切りを使用をOFF
    • OK
      形式設定
  7. さらにOKして、ラベルの位置を調整します。
    計算式を含んだタグ
これをプロジェクトにロードしてみると、次の図のように、面積が小数点以下第3位で切り捨てられていることがわかります。
面積を小数点以下第3位で切り捨てて表示

round関数の取り扱いのポイント

ポイント1 : 引数に単位があってはならない。

roundup(x)、rounddown(x)、round(x)の三つの関数の引数Xは実数であり、面積や長さなど単位のある値を設定することができません。そのため、面積を1㎡で割って単位を取り去った値を設定しています。
rounddown(面積/1)

ポイント2 : 処理できるのは小数点以下第1位だけ

round関数が返す値は自然数です。3.1→3のようにけた処理できるの小数点以下第1位に限定されています。そこで、目的の桁数をnとすると10を(n-1)乗した値をxにかけて、結果を10をn-1乗した値で除算します。
rounddown((面積/1)*100)/100

ポイント3:結果は自然数(単位無し)である

round関数の計算結果は自然数なので100で除算しても単位がありません。そこで1㎡をかけて単位を揃えます。
rounddown((面積/1)*100)*1/100
部屋面積のラベルを選択して[ラベルを編集]をクリックし、計算されたパラメータを編集ボタンをクリックすると、式には
rounddown((面積 / 1 ) * 100) * 1 / 100
という、単位が自動的に補われた式が設定されています。

round関数はタグだけではなく、集計表のフィールドにも使えるので、以上三つのポイントに気をつけて使いこなしてください。

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²

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