公開日:2026/03/28
title.png

38th Season


#38-8 BlocklyにFloat型を追加

 オリジナル16ビットCPUコアMoscoviumの開発環境であるBlockly for MoscoviumにFloat型ブロック群を追加するのが今回のテーマです。

Blockly for Moscovium(現状確認)

 Blockly for Moscoviumでは、整数演算のみならず浮動小数演算も実行することができます。これまで、整数演算と浮動小数演算の切り替えはコメント中の変換オプションで切り替える方式としていました(下図)。

a388_intflt.png

 上図の例だと、item_a=3(整数)で、item_b=3.33…(浮動小数)と言う結果が得られます。

 ただ、上図の様にコメントポップアップ💬を開いた状態ならまだしも、閉じてあると、見た目では整数演算なのか、浮動小数演算なのか判りません。加えて、「XML内で、変換オプションの宣言位置から後ろに出現したブロックに有効」な仕様なので、オプションの指定場所によっては、どこからどこまでが有効範囲なのか悩むこともありました。
 何より、Blocklyらしくない……。

 例えばBlocklyでは、

等の印象がありますから。

Float型ブロック群を追加

 従来の数値を整数型と見なして、新たに浮動小数型(Float型)を追加して、整数演算用のブロックと浮動小数演算用のブロックを分離して見ましょう。
 以下図の様に、見た目でも、どちらの型を使っているのか判るようにしました。

a316_blky_floa.png

 従来から存在する算術演算系のブロックは整数演算専用とします。これに伴い、変換オプション方式は廃止です。その結果、従来のプログラムは、新バージョンのBlockly for Moscoviumとの互換性を失う事になります

 過去作成したプログラムの修正が必要となる訳ですが、止むを得ません、これを許容します。新方式の方が明らかに「あるべき姿」なので、ここで膿を出して正します。

Float型カスタムブロックの作成

 前節に挙げたようなカスタムブロックを設計して行きます(下図)。

a388_flttyp.png

 上図の通り、Float型のブロックが、属性の合う接続点(コネクタ)にしか繋げられなくなる様に、「other[Float]属性」を付けて新たなブロックを作成しました。

制限

 other[Float]属性が付いたので、基本的には「other[Float]属性の付いたブロックとしか接続できない」のが期待なのですが、Blocklyには「any属性」と言うのがあって、こいつが付いていると、新しく作ったother[Float]等の属性とも接続できてしまいます。

 Blocklyに予め用意されていたデフォルトブロックはany属性が指定されているらしく、other[Float]属性も接続できてしまいます。ほんの一例ですが、下図に例を示します。

a388_setvar.png

 当方の意図としては、「異なる型のブロック同士を接続できない」事が期待でした。つまり、上図で「×」印の付いたブロックが接続できないのは期待通りです。「△」印の付いたブロックが接続できてしまう事は期待に反しています。

 A)、B)どちらの思想を目指したのやら?Blockly自体の思想が統一されていない感があります。

 Blocklyの変数にも、数値型、文字列型、Float型と言った区別が無いので、たった今までFloat型として使っていた変数を数値型(整数型)として参照することができてしまいます。もう、その辺はBlocklyの自由度に依存しているので、ここに手を入れるのは手に余ります。放置するしかないという結論に至りました。
 Float型として代入した変数を、整数型として参照しても、自動的に型変換(C言語で言う所のキャスト)される事は無いので、注意して使ってみてください。

  例)浮動小数として変数Aに代入した3.14のバイナリ表現

 逆(整数として変数に代入、浮動小数として参照)の場合も、同様です。

デザイン

 Blockly for Moscovium開発環境(Blockly.XML→Moscovium.ASM変換スクリプト含む)は、MoscoviumシリーズのGitHubに含まれています(以下バナー)。

btn_moscovium.png

 Blockly for Moscoviumに関しては、こちらのマニュアルでご確認ください。
 Blockly for Moscovium開発環境の立ち上げ方法については、こちらを参照してください。

無支援・無保証

 Float型ブロックに対応した新しい開発環境は「ver.2」と言う事で、今までのBlockly for Moscovium(ver.1)とは互換性がありません。

 御免なさいm(1__)m

ですが、元々、本ページの設計データは無支援・無保証ですので、ご容赦いただくしかありません。どうしても、過去のバージョンを使いたい場合は、Githubから適切なバージョンに遡ってご利用ください。

実験はシミュレーション検証で良いや

 開発環境の動作確認ですから、FPGAに書き込んで実機で動作確認する程の事ではありません。Vivadoのシミュレーションで動作検証してみます。
 各々適切なデザインでシミュレーションすれば良いのですが、浮動小数演算を使うので、浮動小数演算ユニットを搭載したマイコンを使う必要があります。お勧めは、Nihoniumに単精度浮動小数演算ユニットS-FPUを搭載したマイコン(nhoc113fs0408.vh等)です。

浮動小数で求める円周率

 多倍長固定小数を使った円周率の計算ではなくて、浮動小数を使って円周率を求めるプログラムをFloat型を使って作成し直しました(以下リンク)。

  プログラム:blky_calc_pi.bxml (PNG)

 アルコリズムは多倍長固定小数のプログラムと同様、マチン公式です。

 こちらの手順に従ってMoscoviumの実行オブジェクトへ変換し、Vivadoでシミュレーションを実行して見ました。

  実験サンプル:シミュレーション結果ログ
  PI = 3.1415915
  Test Pass
  CPI: 4888/ 3178( 0)= 1538/1000
  finish: 215360 [ns]

 3.1415915と、6桁まで正しい値が算出できました。元々、32ビット単精度浮動小数は、有効数字約6.92桁しかありませんので、これ以上の桁数を計算する事はできません。

 今回は、Blockly for Moscoviumに追加したFloat型(浮動小数)演算機能の検証が目的なので、円周率6桁まで正しく計算できたことで、合格とします。

Newton-Raphson法による高速開平

 続いて、Newton-Raphson法を使った高速開平アルゴリズムで浮動小数の平方根を計算するプログラムを使って検証します。

  プログラム:lib_math_sqrt.bxml

  実験サンプル:シミュレーション結果ログ
  PLOT
  00000000 00000000
  3dcccccc 3ea1e89a
  3e4ccccc 3ee4f92d
  3e999999 3f0c378b
  :
  : (中略)
  :
  411b3322 404753a2
  411cccbb 404859fd
  411e6654 40495f01
  411fffed 404a62b5
  END
  Test Pass
  CPI: 50852/ 33391( 0)= 1522/1000
  finish: 2053920 [ns]


 こちらの実験と同様にしてグラフ化すると、以下図の様なグラフが描けました。

a246_sqrt.png

 上図(その物)は以前別プログラムで計算したグラフです。今回の結果で改めて描画する程の事ではないので、使い回しました(1^ε^;)。実際、同等なグラフが描けたことを確認済みです。

 今回は、Blockly for Moscoviumに追加したFloat型(浮動小数)演算機能の検証が目的なので、平方根関数のグラフが描けたことで、こちらも合格です。

マンデルブロ集合の描画

 最後に、浮動小数演算の塊である、マンデルブロ集合描画プログラムをFloat型ブロックに対応させ、動作確認して見ました。

  「#36-9 Blocklyの実行速度は?

a369_expr.jpg

 Float型ブロックに対応したバージョンのプログラムを以下にリンクしておきます。

  Float型対応版プログラム:mandelbrot.bxml

 こちらのサンプル等で、同等の描画を確認できました。合格です。


 「コメント中の変換オプションで数値型を切り替える」と言う、乱暴な仕様は排して見ました。過去のバージョンとの互換性は失いましたが、新バージョンの方が、あるべき姿に近いはずだと信じています。


btn_arduino.png

btn_prev.png btn_next.png

home