キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
ライブラリ&オブジェクト
ArchicadとBIMcloudのライブラリ、ライブラリの管理と移行、オブジェクトとその他のライブラリオブジェクトなどに関するフォーラムです。

【検証】Archicadで広大なゾーンを作った時の不思議な話(FRA()の最大値)

Kotetsu
Enthusiast

条件

  • ゾーンラベルではなくゾーンスタンプを使用している場合
  • ゾーンの面積が21,474,836.47㎡(≒2千万㎡)を超える場合

である場合のみ起きる現象です。

そのためゾーンラベルがデフォルトになったArchicad26ではあまり起きない現象と思われますが、検証したら面白いことがわかったので共有します。(雑談程度のノリで見てください)

 

 

現象

モデル表示オプションでチェックを入れると26でもゾーンスタンプを表示することができます。

Kotetsu_0-1683288605784.png

 

で、ゾーンスタンプを表示した状態で広大な面積のゾーンを作成したら不思議なことが起こりました。

Kotetsu_1-1683288726064.png

5000m x 5000mのゾーンを作成したら、ゾーンスタンプの値がおかしな事になったのです!

面積がマイナス??なんじゃこりゃ🤔

 

この現象は4000m x 4000mでは起こりません。

Kotetsu_2-1683289235896.png

 

色々検証した結果、面積が21,474,836.47㎡を超えると数値がバグることがわかりました。

現在はゾーンラベルを使っている方が多いでしょうし、そもそもこれだけの面積のゾーンを使うことも無いと思うのであまり心配することは無いでしょうが・・・。

 

 

検証

一定規模を超えるとNG?でもなんでラベルはOKでスタンプはNGなんだろう?

その謎を解明すべく我々はアマゾンの奥地へと向かったゾーンスタンプをCtrl + Shift+Oで開いてみました。

 

⚠️マニアックな内容が含まれます。ご注意ください。

 

Kotetsu_3-1683289521671.png

詳細は省きますが、怪しい変数の中身を見ていくと原因らしき記述にたどり着きました。

if iAreaprec = 5 then
	m2keta = 2	: bairitu = 100
endif

!~~~中略~~~

if iDisp_Prec = 1 then
	a_meter = _calculatedArea * bairitu
	a_meter = (a_meter - FRA(a_meter))/bairitu
endif

結果的に、このなかでも後半の「FRA(a_meter)」が問題でした。

このFRA関数は()の中の数値の小数部分のみを返すするものですが、()の中の数値が2,147,483,648を超えると小数部分では無く、値+2,147,483,648を返してしまうようです。

(ここの値が面積でNGになる限界の100倍になっているのは上記の処理でbairitu = 100を掛けているため)

つまりFRA(3,000,000,000.55)とすると本当は0.55が返ってくるはずなのに5,147,483,648.55が返ってきてしまいます。

そのため、5000m x 5000m の例では

25,000,000 - (25,000,000 + 21,474,836.48) = -21,474,836.48㎡

という値が表示されてしまっていると思われます。

 

 

考察

プログラムを書かれる方なら多分ピンと来ていると思いますが、「2,147,483,647」という数値はint型の最大値です。

ということは、FRA()関数の整数部分が内部でintで処理されていて、intの最大値を超えるとオーバーフローしている?

ここまで行くとプログラマーでは無い私には手に負えないので詳しい人がいたら解説お願いします🙏

あとおかしな記述があればツッコミ歓迎です。

とりあえず、FRA関数を使うときは気をつけた方が良さそうです。

 

 

最後に

Archicadはあくまで建築系のBIMソフトなので、あまりにも広大な面積を処理するようにはできていません。

今回のこと以外にも不具合が出がちなので、広大な敷地に建物が点在するような場合は、ひとつひとつの建物を別ファイルにして、別のソフトウェアで統合した方が良いでしょう。

 

 

1件の返信1

TOMIMARI
Booster

そこまで突き詰めて原因を特定する事が可能なんて凄いです。

INTは小数点以下切り捨て出来るけど、永遠ではないという事ですね。

マニアックで奥深い話ですが、刺激を受ける内容でとても面白いですね。

回答が見つかりませんでしたか?

このフォーラムで
他の記事をチェック

フォーラムへ戻る

最新の解決策をチェック

採用された解決策

新しいディスカッションを始める

投稿する