原因は計算の中で行っている単精度実数演算

どこでオーバーフローが起きているのか?オーバーフローを起こしている関数を突き止めたいのだが… TREEVIEW::setMappingをチェックしてみよう.初期フェーズでFramePositionからの呼び出しがある他はどこからも呼ばれていない.⇒不良は主に結婚点の不一致が原因と思われる.ここではGetBrotherJointで結婚点座標を計算しているが,MARGBOX:TopCenterからDEV2というマクロが実行されている.このマクロは内部でfloat演算を実施しているが,単精度実数の精度は32ビットということになっているようだ.

!解けてしまった!原因は計算の中で実施している単精度実数演算にあることが確定した.そもそも,2ないし4で割る計算でシフト演算を使っていないというところが腑に落ちない.多分,単純シフトでは負数の場合は具合が悪いということでフロート演算を使うことにしたのではないかという気がするのだが… 最上位ビットを維持しながらシフトするというのはそれほど難しくないはずだ.マクロにしたのは,計算時間を節約するためと思われるが,浅慮だったと思う.実数演算にしたもう一つの理由として考えられるのは,四捨五入して丸めているという点だ.シフトでは基本的に切り捨てになってしまうから,誤差の累積を考えると必ずしも悪い判断とは言えないが…

ともかく,この計算はシフトを用いた除算に書き換えておこう.⇒そもそも,C++のシフト演算では対象が符号付き整数の場合は符号を維持した値を返している.ただし,これは右シフトの場合だけで,左シフトの場合には,結果は不定だ.これで完全に解決した.どこか別のところでも単精度実数を使っている可能性があるので,チェックしておこう.⇒「float」という語句は180箇所出現するが,すべて一括変換してdoubleに変えておこう.⇒その前に一度バックアップ.⇒216個置換された.

floatからdoubleへの切り替えで少し遅くなるかもしれない.VBではfloatを使っているところはないのだろうか?ここでは計算は実行していないので,たとえ使われていたとしても実害はないはずだが…

53直系血族図.ZELを開こうとして,「COUPLING::OpenFamilyBase ファイル形式が合っていません」というエラーになった.ブロック名と呼ばれる埋め込みコードが一致しないというエラーだ. ⇒ズーム倍率を単精度でファイルに保存している.⇒ズーム関係のパラメータはfloatに戻しておこう.⇒一通り修正を入れ終わったが,まだ解消していない.⇒ページ設定の読み込み不良が起きている.「これは縦書きフォントではない」というエラーも出ている.SerializeHeader はパスしている.

PNTPERLOGとPIXPERLOGをfloatに戻さなくてはならない.⇒まだ,解消しない.⇒_PAGESETUPのmultiplier(印刷倍率)はdoubleだ.しかし,この値に大雨するMAPPING::zoom_outputはフロートだ.取り敢えず実害はないと思われるので,ママとしておこう.⇒できた.大分いい感じになってきた.修正を可能な範囲でフィックスしておこう.

  1. フォントサイズを縮小する@20230209 → 廃止
  2. 単精度実数を使わない@20230212 → 確定
  3. 系列再配置前ではDCを操作しない@20230212 → 確定
  4. 結婚枠だけをセグメント検定の対象とする@20230125 → 廃止
  5. セグメント検定を二段階で実施する@20230129 → 確定
  6. CARDLINK:dispselectboxを廃止する@20230211 → 確定 
  7. CARDLINK:dispprimeboxを廃止する@20230211 → 確定 
  8. CARDLINK:DrawCardImageを廃止する@20230211 → 確定
  9. TOPOLOGY:DrawTooYoungWifeを移動@20230211 → 確定

論理座標系ではフォントサイズをつねに1で計算するというのは面白い仕様だが,最終仕様にはならない.計算負荷はそれほど大きな差にはならないと考えられるからだ.ただし,系列再配置中はCOUPLINGの論理フォントにアクセスしないという制限が守られているかどうかをチェックするのは意味があるので,やってみよう.⇒TREEVIEW::setDispParmではノード対リストの準備も行っているので,NamePropertyなどは渡す必要がある.⇒問題なく動作している.ただし,メインループの出口でTREEVIEW->setDispParm(true)を実行するようにした.

▲フォントサイズを変えると画面が崩れてしまう.「フォントサイズ1を試す@20230212」というオプションをオフにすれば,ノーマルな図式が表示される.ただし,Collatz4000X.ZELのような大きなサンプルでフォントサイズを変えた場合には,かなりひどい画面になる.系統並び替えを実行すれば整った図面に戻すことは可能だが… フォントサイズ1を試す@20230212」はオフにしてあるので,この不良はUpdateDiagramの不備によると言える.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA