2023-05-05 10:03 PM - 編集済み 2023-05-05 10:05 PM
である場合のみ起きる現象です。
そのためゾーンラベルがデフォルトになったArchicad26ではあまり起きない現象と思われますが、検証したら面白いことがわかったので共有します。(雑談程度のノリで見てください)
モデル表示オプションでチェックを入れると26でもゾーンスタンプを表示することができます。
で、ゾーンスタンプを表示した状態で広大な面積のゾーンを作成したら不思議なことが起こりました。
5000m x 5000mのゾーンを作成したら、ゾーンスタンプの値がおかしな事になったのです!
面積がマイナス??なんじゃこりゃ🤔
この現象は4000m x 4000mでは起こりません。
色々検証した結果、面積が21,474,836.47㎡を超えると数値がバグることがわかりました。
現在はゾーンラベルを使っている方が多いでしょうし、そもそもこれだけの面積のゾーンを使うことも無いと思うのであまり心配することは無いでしょうが・・・。
一定規模を超えるとNG?でもなんでラベルはOKでスタンプはNGなんだろう?
その謎を解明すべく我々はアマゾンの奥地へと向かったゾーンスタンプをCtrl + Shift+Oで開いてみました。
⚠️マニアックな内容が含まれます。ご注意ください。
詳細は省きますが、怪しい変数の中身を見ていくと原因らしき記述にたどり着きました。
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ソフトなので、あまりにも広大な面積を処理するようにはできていません。
今回のこと以外にも不具合が出がちなので、広大な敷地に建物が点在するような場合は、ひとつひとつの建物を別ファイルにして、別のソフトウェアで統合した方が良いでしょう。
2023-05-08 11:50 AM
そこまで突き詰めて原因を特定する事が可能なんて凄いです。
INTは小数点以下切り捨て出来るけど、永遠ではないという事ですね。
マニアックで奥深い話ですが、刺激を受ける内容でとても面白いですね。